protoc 2.6.1.1 → 2.6.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (479) hide show
  1. checksums.yaml +4 -4
  2. data/ext/protoc/Makefile.in +10 -13
  3. data/ext/protoc/extconf.rb +0 -1
  4. data/ext/protoc/protobuf/CHANGES.txt +593 -0
  5. data/ext/protoc/protobuf/CONTRIBUTORS.txt +93 -0
  6. data/ext/protoc/protobuf/INSTALL.txt +237 -0
  7. data/ext/protoc/protobuf/LICENSE +33 -0
  8. data/ext/protoc/protobuf/Makefile.am +267 -0
  9. data/ext/protoc/protobuf/README.md +167 -0
  10. data/ext/protoc/protobuf/autogen.sh +41 -0
  11. data/ext/protoc/protobuf/benchmarks/ProtoBench.java +203 -0
  12. data/ext/protoc/protobuf/benchmarks/google_message1.dat +0 -0
  13. data/ext/protoc/protobuf/benchmarks/google_message2.dat +0 -0
  14. data/ext/protoc/protobuf/benchmarks/google_size.proto +136 -0
  15. data/ext/protoc/protobuf/benchmarks/google_speed.proto +136 -0
  16. data/ext/protoc/protobuf/benchmarks/readme.txt +50 -0
  17. data/ext/protoc/protobuf/configure.ac +159 -0
  18. data/ext/protoc/protobuf/editors/README.txt +5 -0
  19. data/ext/protoc/protobuf/editors/proto.vim +105 -0
  20. data/ext/protoc/protobuf/editors/protobuf-mode.el +220 -0
  21. data/ext/protoc/protobuf/examples/AddPerson.java +95 -0
  22. data/ext/protoc/protobuf/examples/ListPeople.java +50 -0
  23. data/ext/protoc/protobuf/examples/Makefile +58 -0
  24. data/ext/protoc/protobuf/examples/README.txt +29 -0
  25. data/ext/protoc/protobuf/examples/add_person.cc +95 -0
  26. data/ext/protoc/protobuf/examples/add_person.py +58 -0
  27. data/ext/protoc/protobuf/examples/addressbook.proto +30 -0
  28. data/ext/protoc/protobuf/examples/list_people.cc +68 -0
  29. data/ext/protoc/protobuf/examples/list_people.py +38 -0
  30. data/ext/protoc/protobuf/generate_descriptor_proto.sh +33 -0
  31. data/ext/protoc/protobuf/java/README.txt +96 -0
  32. data/ext/protoc/protobuf/java/pom.xml +217 -0
  33. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java +466 -0
  34. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java +355 -0
  35. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java +253 -0
  36. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java +51 -0
  37. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java +64 -0
  38. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java +163 -0
  39. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ByteString.java +1022 -0
  40. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java +1311 -0
  41. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java +1297 -0
  42. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java +2238 -0
  43. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java +622 -0
  44. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Extension.java +96 -0
  45. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java +392 -0
  46. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java +185 -0
  47. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java +907 -0
  48. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java +2213 -0
  49. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +949 -0
  50. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Internal.java +391 -0
  51. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java +122 -0
  52. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyField.java +154 -0
  53. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyFieldLite.java +176 -0
  54. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java +367 -0
  55. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java +163 -0
  56. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java +362 -0
  57. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Message.java +244 -0
  58. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java +320 -0
  59. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java +60 -0
  60. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java +143 -0
  61. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageReflection.java +931 -0
  62. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Parser.java +261 -0
  63. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java +58 -0
  64. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolStringList.java +48 -0
  65. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java +696 -0
  66. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java +957 -0
  67. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java +47 -0
  68. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java +71 -0
  69. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcController.java +118 -0
  70. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java +134 -0
  71. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Service.java +117 -0
  72. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java +52 -0
  73. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java +241 -0
  74. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java +618 -0
  75. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java +1984 -0
  76. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +99 -0
  77. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java +995 -0
  78. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java +205 -0
  79. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Utf8.java +349 -0
  80. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java +163 -0
  81. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java +527 -0
  82. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +68 -0
  83. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java +759 -0
  84. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CheckUtf8Test.java +141 -0
  85. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java +769 -0
  86. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +401 -0
  87. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java +80 -0
  88. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java +735 -0
  89. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java +326 -0
  90. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java +48 -0
  91. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java +1515 -0
  92. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java +180 -0
  93. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java +421 -0
  94. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java +134 -0
  95. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldTest.java +121 -0
  96. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java +319 -0
  97. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java +174 -0
  98. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java +143 -0
  99. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java +85 -0
  100. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java +148 -0
  101. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +396 -0
  102. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java +353 -0
  103. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java +185 -0
  104. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java +381 -0
  105. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java +190 -0
  106. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java +97 -0
  107. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +115 -0
  108. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java +320 -0
  109. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java +155 -0
  110. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java +420 -0
  111. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java +96 -0
  112. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java +4124 -0
  113. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java +994 -0
  114. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +653 -0
  115. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java +227 -0
  116. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java +606 -0
  117. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lazy_fields_lite.proto +61 -0
  118. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lite_equals_and_hash.proto +55 -0
  119. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto +77 -0
  120. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto +53 -0
  121. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto +46 -0
  122. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto +48 -0
  123. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto +49 -0
  124. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto +50 -0
  125. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test.proto +38 -0
  126. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test2.proto +42 -0
  127. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test3.proto +43 -0
  128. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto +157 -0
  129. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8.proto +50 -0
  130. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8_size.proto +51 -0
  131. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_custom_options.proto +43 -0
  132. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_extra_interfaces.proto +60 -0
  133. data/ext/protoc/protobuf/m4/ac_system_extensions.m4 +37 -0
  134. data/ext/protoc/protobuf/m4/acx_check_suncc.m4 +75 -0
  135. data/ext/protoc/protobuf/m4/acx_pthread.m4 +397 -0
  136. data/ext/protoc/protobuf/m4/stl_hash.m4 +72 -0
  137. data/ext/protoc/protobuf/more_tests/Makefile +41 -0
  138. data/ext/protoc/protobuf/post_process_dist.sh +60 -0
  139. data/ext/protoc/protobuf/protobuf-lite.pc.in +13 -0
  140. data/ext/protoc/protobuf/protobuf.pc.in +14 -0
  141. data/ext/protoc/protobuf/python/README.txt +105 -0
  142. data/ext/protoc/protobuf/python/ez_setup.py +284 -0
  143. data/ext/protoc/protobuf/python/google/__init__.py +1 -0
  144. data/ext/protoc/protobuf/python/google/protobuf/__init__.py +0 -0
  145. data/ext/protoc/protobuf/python/google/protobuf/descriptor.py +849 -0
  146. data/ext/protoc/protobuf/python/google/protobuf/descriptor_database.py +137 -0
  147. data/ext/protoc/protobuf/python/google/protobuf/descriptor_pool.py +643 -0
  148. data/ext/protoc/protobuf/python/google/protobuf/internal/__init__.py +0 -0
  149. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.cc +139 -0
  150. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.py +89 -0
  151. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation_default_test.py +63 -0
  152. data/ext/protoc/protobuf/python/google/protobuf/internal/containers.py +269 -0
  153. data/ext/protoc/protobuf/python/google/protobuf/internal/cpp_message.py +663 -0
  154. data/ext/protoc/protobuf/python/google/protobuf/internal/decoder.py +831 -0
  155. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_database_test.py +63 -0
  156. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test.py +564 -0
  157. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test1.proto +94 -0
  158. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test2.proto +70 -0
  159. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_python_test.py +54 -0
  160. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_test.py +669 -0
  161. data/ext/protoc/protobuf/python/google/protobuf/internal/encoder.py +788 -0
  162. data/ext/protoc/protobuf/python/google/protobuf/internal/enum_type_wrapper.py +89 -0
  163. data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test1.proto +57 -0
  164. data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test2.proto +92 -0
  165. data/ext/protoc/protobuf/python/google/protobuf/internal/generator_test.py +343 -0
  166. data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_python_test.py +54 -0
  167. data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_test.py +131 -0
  168. data/ext/protoc/protobuf/python/google/protobuf/internal/message_listener.py +78 -0
  169. data/ext/protoc/protobuf/python/google/protobuf/internal/message_python_test.py +54 -0
  170. data/ext/protoc/protobuf/python/google/protobuf/internal/message_test.py +681 -0
  171. data/ext/protoc/protobuf/python/google/protobuf/internal/missing_enum_values.proto +50 -0
  172. data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions.proto +58 -0
  173. data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto +49 -0
  174. data/ext/protoc/protobuf/python/google/protobuf/internal/more_messages.proto +51 -0
  175. data/ext/protoc/protobuf/python/google/protobuf/internal/python_message.py +1251 -0
  176. data/ext/protoc/protobuf/python/google/protobuf/internal/reflection_test.py +2934 -0
  177. data/ext/protoc/protobuf/python/google/protobuf/internal/service_reflection_test.py +136 -0
  178. data/ext/protoc/protobuf/python/google/protobuf/internal/symbol_database_test.py +120 -0
  179. data/ext/protoc/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto +52 -0
  180. data/ext/protoc/protobuf/python/google/protobuf/internal/test_util.py +662 -0
  181. data/ext/protoc/protobuf/python/google/protobuf/internal/text_encoding_test.py +68 -0
  182. data/ext/protoc/protobuf/python/google/protobuf/internal/text_format_test.py +743 -0
  183. data/ext/protoc/protobuf/python/google/protobuf/internal/type_checkers.py +328 -0
  184. data/ext/protoc/protobuf/python/google/protobuf/internal/unknown_fields_test.py +231 -0
  185. data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format.py +268 -0
  186. data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format_test.py +253 -0
  187. data/ext/protoc/protobuf/python/google/protobuf/message.py +284 -0
  188. data/ext/protoc/protobuf/python/google/protobuf/message_factory.py +155 -0
  189. data/ext/protoc/protobuf/python/google/protobuf/pyext/README +6 -0
  190. data/ext/protoc/protobuf/python/google/protobuf/pyext/__init__.py +0 -0
  191. data/ext/protoc/protobuf/python/google/protobuf/pyext/cpp_message.py +61 -0
  192. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.cc +357 -0
  193. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.h +96 -0
  194. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor_cpp2_test.py +58 -0
  195. data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.cc +338 -0
  196. data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.h +123 -0
  197. data/ext/protoc/protobuf/python/google/protobuf/pyext/message.cc +2561 -0
  198. data/ext/protoc/protobuf/python/google/protobuf/pyext/message.h +305 -0
  199. data/ext/protoc/protobuf/python/google/protobuf/pyext/message_factory_cpp2_test.py +56 -0
  200. data/ext/protoc/protobuf/python/google/protobuf/pyext/proto2_api_test.proto +38 -0
  201. data/ext/protoc/protobuf/python/google/protobuf/pyext/python.proto +66 -0
  202. data/ext/protoc/protobuf/python/google/protobuf/pyext/python_protobuf.h +57 -0
  203. data/ext/protoc/protobuf/python/google/protobuf/pyext/reflection_cpp2_generated_test.py +94 -0
  204. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc +763 -0
  205. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.h +172 -0
  206. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.cc +825 -0
  207. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.h +112 -0
  208. data/ext/protoc/protobuf/python/google/protobuf/pyext/scoped_pyobject_ptr.h +95 -0
  209. data/ext/protoc/protobuf/python/google/protobuf/reflection.py +205 -0
  210. data/ext/protoc/protobuf/python/google/protobuf/service.py +226 -0
  211. data/ext/protoc/protobuf/python/google/protobuf/service_reflection.py +284 -0
  212. data/ext/protoc/protobuf/python/google/protobuf/symbol_database.py +185 -0
  213. data/ext/protoc/protobuf/python/google/protobuf/text_encoding.py +110 -0
  214. data/ext/protoc/protobuf/python/google/protobuf/text_format.py +873 -0
  215. data/ext/protoc/protobuf/python/mox.py +1401 -0
  216. data/ext/protoc/protobuf/python/setup.py +201 -0
  217. data/ext/protoc/protobuf/python/stubout.py +140 -0
  218. data/ext/protoc/protobuf/src/Makefile.am +418 -0
  219. data/ext/protoc/protobuf/src/google/protobuf/SEBS +240 -0
  220. data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.cc +84 -0
  221. data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.h +145 -0
  222. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.cc +1603 -0
  223. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.h +378 -0
  224. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc +1654 -0
  225. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc +158 -0
  226. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc +288 -0
  227. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h +103 -0
  228. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc +431 -0
  229. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h +122 -0
  230. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc +210 -0
  231. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h +86 -0
  232. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc +166 -0
  233. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h +185 -0
  234. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc +665 -0
  235. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h +99 -0
  236. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc +125 -0
  237. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  238. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc +494 -0
  239. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h +206 -0
  240. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc +2645 -0
  241. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h +175 -0
  242. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc +375 -0
  243. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h +121 -0
  244. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h +58 -0
  245. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc +123 -0
  246. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc +451 -0
  247. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +123 -0
  248. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc +334 -0
  249. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  250. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc +642 -0
  251. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h +127 -0
  252. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto +132 -0
  253. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc +2074 -0
  254. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h +51 -0
  255. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.cc +480 -0
  256. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.h +317 -0
  257. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer_unittest.cc +617 -0
  258. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.cc +195 -0
  259. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.h +95 -0
  260. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc +233 -0
  261. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h +69 -0
  262. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc +67 -0
  263. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.cc +333 -0
  264. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.h +99 -0
  265. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc +778 -0
  266. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.h +158 -0
  267. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.cc +207 -0
  268. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.h +109 -0
  269. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.cc +213 -0
  270. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.h +162 -0
  271. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.cc +534 -0
  272. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.h +115 -0
  273. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.cc +158 -0
  274. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.h +72 -0
  275. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc +77 -0
  276. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h +101 -0
  277. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.cc +737 -0
  278. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.h +322 -0
  279. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc +826 -0
  280. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h +121 -0
  281. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.cc +1666 -0
  282. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.h +140 -0
  283. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.cc +1343 -0
  284. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.h +173 -0
  285. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc +266 -0
  286. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h +124 -0
  287. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc +124 -0
  288. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc +877 -0
  289. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h +160 -0
  290. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.cc +473 -0
  291. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.h +135 -0
  292. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc +201 -0
  293. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h +90 -0
  294. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.cc +1056 -0
  295. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.h +160 -0
  296. data/ext/protoc/protobuf/src/google/protobuf/compiler/main.cc +61 -0
  297. data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.cc +240 -0
  298. data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.h +117 -0
  299. data/ext/protoc/protobuf/src/google/protobuf/compiler/package_info.h +64 -0
  300. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.cc +1750 -0
  301. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.h +522 -0
  302. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser_unittest.cc +2612 -0
  303. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.cc +163 -0
  304. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.h +72 -0
  305. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.cc +1148 -0
  306. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.h +897 -0
  307. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.proto +147 -0
  308. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.cc +1262 -0
  309. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.h +166 -0
  310. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc +118 -0
  311. data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.cc +463 -0
  312. data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.h +108 -0
  313. data/ext/protoc/protobuf/src/google/protobuf/compiler/test_plugin.cc +51 -0
  314. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh +91 -0
  315. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.cc +218 -0
  316. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.h +93 -0
  317. data/ext/protoc/protobuf/src/google/protobuf/descriptor.cc +5420 -0
  318. data/ext/protoc/protobuf/src/google/protobuf/descriptor.h +1691 -0
  319. data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.cc +9135 -0
  320. data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.h +6761 -0
  321. data/ext/protoc/protobuf/src/google/protobuf/descriptor.proto +687 -0
  322. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.cc +543 -0
  323. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.h +369 -0
  324. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database_unittest.cc +748 -0
  325. data/ext/protoc/protobuf/src/google/protobuf/descriptor_pb2_test.py +54 -0
  326. data/ext/protoc/protobuf/src/google/protobuf/descriptor_unittest.cc +5501 -0
  327. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.cc +764 -0
  328. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.h +148 -0
  329. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message_unittest.cc +230 -0
  330. data/ext/protoc/protobuf/src/google/protobuf/extension_set.cc +1663 -0
  331. data/ext/protoc/protobuf/src/google/protobuf/extension_set.h +1234 -0
  332. data/ext/protoc/protobuf/src/google/protobuf/extension_set_heavy.cc +734 -0
  333. data/ext/protoc/protobuf/src/google/protobuf/extension_set_unittest.cc +1095 -0
  334. data/ext/protoc/protobuf/src/google/protobuf/generated_enum_reflection.h +91 -0
  335. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.cc +1683 -0
  336. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.h +504 -0
  337. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc +795 -0
  338. data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.cc +65 -0
  339. data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.h +113 -0
  340. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.cc +914 -0
  341. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.h +1220 -0
  342. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_inl.h +69 -0
  343. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_unittest.cc +1378 -0
  344. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.cc +326 -0
  345. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.h +209 -0
  346. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh +44 -0
  347. data/ext/protoc/protobuf/src/google/protobuf/io/package_info.h +54 -0
  348. data/ext/protoc/protobuf/src/google/protobuf/io/printer.cc +198 -0
  349. data/ext/protoc/protobuf/src/google/protobuf/io/printer.h +136 -0
  350. data/ext/protoc/protobuf/src/google/protobuf/io/printer_unittest.cc +285 -0
  351. data/ext/protoc/protobuf/src/google/protobuf/io/strtod.cc +113 -0
  352. data/ext/protoc/protobuf/src/google/protobuf/io/strtod.h +50 -0
  353. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.cc +1127 -0
  354. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.h +402 -0
  355. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer_unittest.cc +999 -0
  356. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.cc +57 -0
  357. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.h +248 -0
  358. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc +473 -0
  359. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h +358 -0
  360. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc +405 -0
  361. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h +354 -0
  362. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc +965 -0
  363. data/ext/protoc/protobuf/src/google/protobuf/lite_unittest.cc +350 -0
  364. data/ext/protoc/protobuf/src/google/protobuf/message.cc +358 -0
  365. data/ext/protoc/protobuf/src/google/protobuf/message.h +866 -0
  366. data/ext/protoc/protobuf/src/google/protobuf/message_lite.cc +335 -0
  367. data/ext/protoc/protobuf/src/google/protobuf/message_lite.h +247 -0
  368. data/ext/protoc/protobuf/src/google/protobuf/message_unittest.cc +427 -0
  369. data/ext/protoc/protobuf/src/google/protobuf/package_info.h +64 -0
  370. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.cc +269 -0
  371. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.h +81 -0
  372. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops_unittest.cc +475 -0
  373. data/ext/protoc/protobuf/src/google/protobuf/repeated_field.cc +87 -0
  374. data/ext/protoc/protobuf/src/google/protobuf/repeated_field.h +1603 -0
  375. data/ext/protoc/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc +195 -0
  376. data/ext/protoc/protobuf/src/google/protobuf/repeated_field_unittest.cc +1442 -0
  377. data/ext/protoc/protobuf/src/google/protobuf/service.cc +46 -0
  378. data/ext/protoc/protobuf/src/google/protobuf/service.h +291 -0
  379. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops.h +227 -0
  380. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h +325 -0
  381. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h +151 -0
  382. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h +146 -0
  383. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h +122 -0
  384. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h +137 -0
  385. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h +225 -0
  386. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h +313 -0
  387. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h +73 -0
  388. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h +188 -0
  389. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h +219 -0
  390. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc +137 -0
  391. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h +293 -0
  392. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc +112 -0
  393. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h +150 -0
  394. data/ext/protoc/protobuf/src/google/protobuf/stubs/common.cc +395 -0
  395. data/ext/protoc/protobuf/src/google/protobuf/stubs/common.h +1226 -0
  396. data/ext/protoc/protobuf/src/google/protobuf/stubs/common_unittest.cc +357 -0
  397. data/ext/protoc/protobuf/src/google/protobuf/stubs/hash.h +232 -0
  398. data/ext/protoc/protobuf/src/google/protobuf/stubs/map_util.h +771 -0
  399. data/ext/protoc/protobuf/src/google/protobuf/stubs/once.cc +99 -0
  400. data/ext/protoc/protobuf/src/google/protobuf/stubs/once.h +166 -0
  401. data/ext/protoc/protobuf/src/google/protobuf/stubs/once_unittest.cc +253 -0
  402. data/ext/protoc/protobuf/src/google/protobuf/stubs/platform_macros.h +103 -0
  403. data/ext/protoc/protobuf/src/google/protobuf/stubs/shared_ptr.h +470 -0
  404. data/ext/protoc/protobuf/src/google/protobuf/stubs/stl_util.h +121 -0
  405. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.cc +175 -0
  406. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.h +76 -0
  407. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc +152 -0
  408. data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid.cc +536 -0
  409. data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc +40 -0
  410. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.cc +1279 -0
  411. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.h +562 -0
  412. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil_unittest.cc +73 -0
  413. data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.cc +134 -0
  414. data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.h +170 -0
  415. data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util.h +138 -0
  416. data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util_unittest.cc +130 -0
  417. data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits.h +336 -0
  418. data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc +628 -0
  419. data/ext/protoc/protobuf/src/google/protobuf/test_util.cc +3345 -0
  420. data/ext/protoc/protobuf/src/google/protobuf/test_util.h +215 -0
  421. data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.cc +1585 -0
  422. data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.h +101 -0
  423. data/ext/protoc/protobuf/src/google/protobuf/testdata/bad_utf8_string +1 -0
  424. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message +0 -0
  425. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented +0 -0
  426. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_packed_fields_message +0 -0
  427. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt +134 -0
  428. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt +129 -0
  429. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt +134 -0
  430. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt +129 -0
  431. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt +134 -0
  432. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt +134 -0
  433. data/ext/protoc/protobuf/src/google/protobuf/testing/file.cc +194 -0
  434. data/ext/protoc/protobuf/src/google/protobuf/testing/file.h +97 -0
  435. data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.cc +255 -0
  436. data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.h +102 -0
  437. data/ext/protoc/protobuf/src/google/protobuf/testing/zcgunzip.cc +73 -0
  438. data/ext/protoc/protobuf/src/google/protobuf/testing/zcgzip.cc +79 -0
  439. data/ext/protoc/protobuf/src/google/protobuf/text_format.cc +1746 -0
  440. data/ext/protoc/protobuf/src/google/protobuf/text_format.h +473 -0
  441. data/ext/protoc/protobuf/src/google/protobuf/text_format_unittest.cc +1479 -0
  442. data/ext/protoc/protobuf/src/google/protobuf/unittest.proto +861 -0
  443. data/ext/protoc/protobuf/src/google/protobuf/unittest_custom_options.proto +393 -0
  444. data/ext/protoc/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto +50 -0
  445. data/ext/protoc/protobuf/src/google/protobuf/unittest_empty.proto +37 -0
  446. data/ext/protoc/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto +1046 -0
  447. data/ext/protoc/protobuf/src/google/protobuf/unittest_import.proto +64 -0
  448. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_lite.proto +51 -0
  449. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public.proto +40 -0
  450. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public_lite.proto +42 -0
  451. data/ext/protoc/protobuf/src/google/protobuf/unittest_lite.proto +384 -0
  452. data/ext/protoc/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto +43 -0
  453. data/ext/protoc/protobuf/src/google/protobuf/unittest_mset.proto +83 -0
  454. data/ext/protoc/protobuf/src/google/protobuf/unittest_no_generic_services.proto +53 -0
  455. data/ext/protoc/protobuf/src/google/protobuf/unittest_optimize_for.proto +66 -0
  456. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.cc +265 -0
  457. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.h +318 -0
  458. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set_unittest.cc +599 -0
  459. data/ext/protoc/protobuf/src/google/protobuf/wire_format.cc +1101 -0
  460. data/ext/protoc/protobuf/src/google/protobuf/wire_format.h +336 -0
  461. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.cc +471 -0
  462. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.h +661 -0
  463. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite_inl.h +860 -0
  464. data/ext/protoc/protobuf/src/google/protobuf/wire_format_unittest.cc +1120 -0
  465. data/ext/protoc/protobuf/src/solaris/libstdc++.la +51 -0
  466. data/ext/protoc/protobuf/vsprojects/config.h +29 -0
  467. data/ext/protoc/protobuf/vsprojects/convert2008to2005.sh +20 -0
  468. data/ext/protoc/protobuf/vsprojects/extract_includes.bat +50 -0
  469. data/ext/protoc/protobuf/vsprojects/libprotobuf-lite.vcproj +302 -0
  470. data/ext/protoc/protobuf/vsprojects/libprotobuf.vcproj +470 -0
  471. data/ext/protoc/protobuf/vsprojects/libprotoc.vcproj +466 -0
  472. data/ext/protoc/protobuf/vsprojects/lite-test.vcproj +305 -0
  473. data/ext/protoc/protobuf/vsprojects/protobuf.sln +92 -0
  474. data/ext/protoc/protobuf/vsprojects/protoc.vcproj +192 -0
  475. data/ext/protoc/protobuf/vsprojects/readme.txt +114 -0
  476. data/ext/protoc/protobuf/vsprojects/test_plugin.vcproj +209 -0
  477. data/ext/protoc/protobuf/vsprojects/tests.vcproj +681 -0
  478. data/lib/protoc/version.rb +1 -1
  479. metadata +480 -3
@@ -0,0 +1,206 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // https://developers.google.com/protocol-buffers/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above
12
+ // copyright notice, this list of conditions and the following disclaimer
13
+ // in the documentation and/or other materials provided with the
14
+ // distribution.
15
+ // * Neither the name of Google Inc. nor the names of its
16
+ // contributors may be used to endorse or promote products derived from
17
+ // this software without specific prior written permission.
18
+ //
19
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ // Author: kenton@google.com (Kenton Varda)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+
35
+ #ifndef GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__
36
+ #define GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__
37
+
38
+ #include <map>
39
+ #include <string>
40
+ #include <google/protobuf/descriptor.h>
41
+ #include <google/protobuf/descriptor.pb.h>
42
+
43
+ namespace google {
44
+ namespace protobuf {
45
+
46
+ namespace io {
47
+ class Printer;
48
+ }
49
+
50
+ namespace compiler {
51
+ namespace cpp {
52
+
53
+ // Commonly-used separator comments. Thick is a line of '=', thin is a line
54
+ // of '-'.
55
+ extern const char kThickSeparator[];
56
+ extern const char kThinSeparator[];
57
+
58
+ // Returns the non-nested type name for the given type. If "qualified" is
59
+ // true, prefix the type with the full namespace. For example, if you had:
60
+ // package foo.bar;
61
+ // message Baz { message Qux {} }
62
+ // Then the qualified ClassName for Qux would be:
63
+ // ::foo::bar::Baz_Qux
64
+ // While the non-qualified version would be:
65
+ // Baz_Qux
66
+ string ClassName(const Descriptor* descriptor, bool qualified);
67
+ string ClassName(const EnumDescriptor* enum_descriptor, bool qualified);
68
+
69
+ string SuperClassName(const Descriptor* descriptor);
70
+
71
+ // Get the (unqualified) name that should be used for this field in C++ code.
72
+ // The name is coerced to lower-case to emulate proto1 behavior. People
73
+ // should be using lowercase-with-underscores style for proto field names
74
+ // anyway, so normally this just returns field->name().
75
+ string FieldName(const FieldDescriptor* field);
76
+
77
+ // Get the unqualified name that should be used for a field's field
78
+ // number constant.
79
+ string FieldConstantName(const FieldDescriptor *field);
80
+
81
+ // Returns the scope where the field was defined (for extensions, this is
82
+ // different from the message type to which the field applies).
83
+ inline const Descriptor* FieldScope(const FieldDescriptor* field) {
84
+ return field->is_extension() ?
85
+ field->extension_scope() : field->containing_type();
86
+ }
87
+
88
+ // Returns the fully-qualified type name field->message_type(). Usually this
89
+ // is just ClassName(field->message_type(), true);
90
+ string FieldMessageTypeName(const FieldDescriptor* field);
91
+
92
+ // Strips ".proto" or ".protodevel" from the end of a filename.
93
+ string StripProto(const string& filename);
94
+
95
+ // Get the C++ type name for a primitive type (e.g. "double", "::google::protobuf::int32", etc.).
96
+ // Note: non-built-in type names will be qualified, meaning they will start
97
+ // with a ::. If you are using the type as a template parameter, you will
98
+ // need to insure there is a space between the < and the ::, because the
99
+ // ridiculous C++ standard defines "<:" to be a synonym for "[".
100
+ const char* PrimitiveTypeName(FieldDescriptor::CppType type);
101
+
102
+ // Get the declared type name in CamelCase format, as is used e.g. for the
103
+ // methods of WireFormat. For example, TYPE_INT32 becomes "Int32".
104
+ const char* DeclaredTypeMethodName(FieldDescriptor::Type type);
105
+
106
+ // Return the code that evaluates to the number when compiled.
107
+ string Int32ToString(int number);
108
+
109
+ // Return the code that evaluates to the number when compiled.
110
+ string Int64ToString(int64 number);
111
+
112
+ // Get code that evaluates to the field's default value.
113
+ string DefaultValue(const FieldDescriptor* field);
114
+
115
+ // Convert a file name into a valid identifier.
116
+ string FilenameIdentifier(const string& filename);
117
+
118
+ // Return the name of the AddDescriptors() function for a given file.
119
+ string GlobalAddDescriptorsName(const string& filename);
120
+
121
+ // Return the name of the AssignDescriptors() function for a given file.
122
+ string GlobalAssignDescriptorsName(const string& filename);
123
+
124
+ // Return the qualified C++ name for a file level symbol.
125
+ string QualifiedFileLevelSymbol(const string& package, const string& name);
126
+
127
+ // Return the name of the ShutdownFile() function for a given file.
128
+ string GlobalShutdownFileName(const string& filename);
129
+
130
+ // Escape C++ trigraphs by escaping question marks to \?
131
+ string EscapeTrigraphs(const string& to_escape);
132
+
133
+ // Escaped function name to eliminate naming conflict.
134
+ string SafeFunctionName(const Descriptor* descriptor,
135
+ const FieldDescriptor* field,
136
+ const string& prefix);
137
+
138
+ // Do message classes in this file use UnknownFieldSet?
139
+ // Otherwise, messages will store unknown fields in a string
140
+ inline bool UseUnknownFieldSet(const FileDescriptor* file) {
141
+ return file->options().optimize_for() != FileOptions::LITE_RUNTIME;
142
+ }
143
+
144
+
145
+ // Does this file have any enum type definitions?
146
+ bool HasEnumDefinitions(const FileDescriptor* file);
147
+
148
+ // Does this file have generated parsing, serialization, and other
149
+ // standard methods for which reflection-based fallback implementations exist?
150
+ inline bool HasGeneratedMethods(const FileDescriptor* file) {
151
+ return file->options().optimize_for() != FileOptions::CODE_SIZE;
152
+ }
153
+
154
+ // Do message classes in this file have descriptor and reflection methods?
155
+ inline bool HasDescriptorMethods(const FileDescriptor* file) {
156
+ return file->options().optimize_for() != FileOptions::LITE_RUNTIME;
157
+ }
158
+
159
+ // Should we generate generic services for this file?
160
+ inline bool HasGenericServices(const FileDescriptor* file) {
161
+ return file->service_count() > 0 &&
162
+ file->options().optimize_for() != FileOptions::LITE_RUNTIME &&
163
+ file->options().cc_generic_services();
164
+ }
165
+
166
+ // Should string fields in this file verify that their contents are UTF-8?
167
+ inline bool HasUtf8Verification(const FileDescriptor* file) {
168
+ return file->options().optimize_for() != FileOptions::LITE_RUNTIME;
169
+ }
170
+
171
+ // Should we generate a separate, super-optimized code path for serializing to
172
+ // flat arrays? We don't do this in Lite mode because we'd rather reduce code
173
+ // size.
174
+ inline bool HasFastArraySerialization(const FileDescriptor* file) {
175
+ return file->options().optimize_for() == FileOptions::SPEED;
176
+ }
177
+
178
+ // Returns whether we have to generate code with static initializers.
179
+ bool StaticInitializersForced(const FileDescriptor* file);
180
+
181
+ // Prints 'with_static_init' if static initializers have to be used for the
182
+ // provided file. Otherwise emits both 'with_static_init' and
183
+ // 'without_static_init' using #ifdef.
184
+ void PrintHandlingOptionalStaticInitializers(
185
+ const FileDescriptor* file, io::Printer* printer,
186
+ const char* with_static_init, const char* without_static_init,
187
+ const char* var1 = NULL, const string& val1 = "",
188
+ const char* var2 = NULL, const string& val2 = "");
189
+
190
+ void PrintHandlingOptionalStaticInitializers(
191
+ const map<string, string>& vars, const FileDescriptor* file,
192
+ io::Printer* printer, const char* with_static_init,
193
+ const char* without_static_init);
194
+
195
+
196
+ // Returns true if the field's CPPTYPE is string or message.
197
+ bool IsStringOrMessage(const FieldDescriptor* field);
198
+
199
+ string UnderscoresToCamelCase(const string& input, bool cap_next_letter);
200
+
201
+ } // namespace cpp
202
+ } // namespace compiler
203
+ } // namespace protobuf
204
+
205
+ } // namespace google
206
+ #endif // GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__
@@ -0,0 +1,2645 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // https://developers.google.com/protocol-buffers/
4
+ //
5
+ // Redistribution and use in source and binary forms, with or without
6
+ // modification, are permitted provided that the following conditions are
7
+ // met:
8
+ //
9
+ // * Redistributions of source code must retain the above copyright
10
+ // notice, this list of conditions and the following disclaimer.
11
+ // * Redistributions in binary form must reproduce the above
12
+ // copyright notice, this list of conditions and the following disclaimer
13
+ // in the documentation and/or other materials provided with the
14
+ // distribution.
15
+ // * Neither the name of Google Inc. nor the names of its
16
+ // contributors may be used to endorse or promote products derived from
17
+ // this software without specific prior written permission.
18
+ //
19
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+
31
+ // Author: kenton@google.com (Kenton Varda)
32
+ // Based on original Protocol Buffers design by
33
+ // Sanjay Ghemawat, Jeff Dean, and others.
34
+
35
+ #include <algorithm>
36
+ #include <google/protobuf/stubs/hash.h>
37
+ #include <map>
38
+ #include <memory>
39
+ #include <set>
40
+ #include <utility>
41
+ #include <vector>
42
+ #include <google/protobuf/compiler/cpp/cpp_message.h>
43
+ #include <google/protobuf/compiler/cpp/cpp_field.h>
44
+ #include <google/protobuf/compiler/cpp/cpp_enum.h>
45
+ #include <google/protobuf/compiler/cpp/cpp_extension.h>
46
+ #include <google/protobuf/compiler/cpp/cpp_helpers.h>
47
+ #include <google/protobuf/stubs/strutil.h>
48
+ #include <google/protobuf/io/printer.h>
49
+ #include <google/protobuf/io/coded_stream.h>
50
+ #include <google/protobuf/wire_format.h>
51
+ #include <google/protobuf/descriptor.pb.h>
52
+
53
+
54
+ namespace google {
55
+ namespace protobuf {
56
+ namespace compiler {
57
+ namespace cpp {
58
+
59
+ using internal::WireFormat;
60
+ using internal::WireFormatLite;
61
+
62
+ namespace {
63
+
64
+ void PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) {
65
+ // Print the field's proto-syntax definition as a comment. We don't want to
66
+ // print group bodies so we cut off after the first line.
67
+ string def = field->DebugString();
68
+ printer->Print("// $def$\n",
69
+ "def", def.substr(0, def.find_first_of('\n')));
70
+ }
71
+
72
+ struct FieldOrderingByNumber {
73
+ inline bool operator()(const FieldDescriptor* a,
74
+ const FieldDescriptor* b) const {
75
+ return a->number() < b->number();
76
+ }
77
+ };
78
+
79
+ // Sort the fields of the given Descriptor by number into a new[]'d array
80
+ // and return it.
81
+ const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) {
82
+ const FieldDescriptor** fields =
83
+ new const FieldDescriptor*[descriptor->field_count()];
84
+ for (int i = 0; i < descriptor->field_count(); i++) {
85
+ fields[i] = descriptor->field(i);
86
+ }
87
+ sort(fields, fields + descriptor->field_count(),
88
+ FieldOrderingByNumber());
89
+ return fields;
90
+ }
91
+
92
+ // Functor for sorting extension ranges by their "start" field number.
93
+ struct ExtensionRangeSorter {
94
+ bool operator()(const Descriptor::ExtensionRange* left,
95
+ const Descriptor::ExtensionRange* right) const {
96
+ return left->start < right->start;
97
+ }
98
+ };
99
+
100
+ // Returns true if the "required" restriction check should be ignored for the
101
+ // given field.
102
+ inline static bool ShouldIgnoreRequiredFieldCheck(
103
+ const FieldDescriptor* field) {
104
+ return false;
105
+ }
106
+
107
+ // Returns true if the message type has any required fields. If it doesn't,
108
+ // we can optimize out calls to its IsInitialized() method.
109
+ //
110
+ // already_seen is used to avoid checking the same type multiple times
111
+ // (and also to protect against recursion).
112
+ static bool HasRequiredFields(
113
+ const Descriptor* type,
114
+ hash_set<const Descriptor*>* already_seen) {
115
+ if (already_seen->count(type) > 0) {
116
+ // Since the first occurrence of a required field causes the whole
117
+ // function to return true, we can assume that if the type is already
118
+ // in the cache it didn't have any required fields.
119
+ return false;
120
+ }
121
+ already_seen->insert(type);
122
+
123
+ // If the type has extensions, an extension with message type could contain
124
+ // required fields, so we have to be conservative and assume such an
125
+ // extension exists.
126
+ if (type->extension_range_count() > 0) return true;
127
+
128
+ for (int i = 0; i < type->field_count(); i++) {
129
+ const FieldDescriptor* field = type->field(i);
130
+ if (field->is_required()) {
131
+ return true;
132
+ }
133
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
134
+ !ShouldIgnoreRequiredFieldCheck(field)) {
135
+ if (HasRequiredFields(field->message_type(), already_seen)) {
136
+ return true;
137
+ }
138
+ }
139
+ }
140
+
141
+ return false;
142
+ }
143
+
144
+ static bool HasRequiredFields(const Descriptor* type) {
145
+ hash_set<const Descriptor*> already_seen;
146
+ return HasRequiredFields(type, &already_seen);
147
+ }
148
+
149
+ // This returns an estimate of the compiler's alignment for the field. This
150
+ // can't guarantee to be correct because the generated code could be compiled on
151
+ // different systems with different alignment rules. The estimates below assume
152
+ // 64-bit pointers.
153
+ int EstimateAlignmentSize(const FieldDescriptor* field) {
154
+ if (field == NULL) return 0;
155
+ if (field->is_repeated()) return 8;
156
+ switch (field->cpp_type()) {
157
+ case FieldDescriptor::CPPTYPE_BOOL:
158
+ return 1;
159
+
160
+ case FieldDescriptor::CPPTYPE_INT32:
161
+ case FieldDescriptor::CPPTYPE_UINT32:
162
+ case FieldDescriptor::CPPTYPE_ENUM:
163
+ case FieldDescriptor::CPPTYPE_FLOAT:
164
+ return 4;
165
+
166
+ case FieldDescriptor::CPPTYPE_INT64:
167
+ case FieldDescriptor::CPPTYPE_UINT64:
168
+ case FieldDescriptor::CPPTYPE_DOUBLE:
169
+ case FieldDescriptor::CPPTYPE_STRING:
170
+ case FieldDescriptor::CPPTYPE_MESSAGE:
171
+ return 8;
172
+ }
173
+ GOOGLE_LOG(FATAL) << "Can't get here.";
174
+ return -1; // Make compiler happy.
175
+ }
176
+
177
+ // FieldGroup is just a helper for OptimizePadding below. It holds a vector of
178
+ // fields that are grouped together because they have compatible alignment, and
179
+ // a preferred location in the final field ordering.
180
+ class FieldGroup {
181
+ public:
182
+ FieldGroup()
183
+ : preferred_location_(0) {}
184
+
185
+ // A group with a single field.
186
+ FieldGroup(float preferred_location, const FieldDescriptor* field)
187
+ : preferred_location_(preferred_location),
188
+ fields_(1, field) {}
189
+
190
+ // Append the fields in 'other' to this group.
191
+ void Append(const FieldGroup& other) {
192
+ if (other.fields_.empty()) {
193
+ return;
194
+ }
195
+ // Preferred location is the average among all the fields, so we weight by
196
+ // the number of fields on each FieldGroup object.
197
+ preferred_location_ =
198
+ (preferred_location_ * fields_.size() +
199
+ (other.preferred_location_ * other.fields_.size())) /
200
+ (fields_.size() + other.fields_.size());
201
+ fields_.insert(fields_.end(), other.fields_.begin(), other.fields_.end());
202
+ }
203
+
204
+ void SetPreferredLocation(float location) { preferred_location_ = location; }
205
+ const vector<const FieldDescriptor*>& fields() const { return fields_; }
206
+
207
+ // FieldGroup objects sort by their preferred location.
208
+ bool operator<(const FieldGroup& other) const {
209
+ return preferred_location_ < other.preferred_location_;
210
+ }
211
+
212
+ private:
213
+ // "preferred_location_" is an estimate of where this group should go in the
214
+ // final list of fields. We compute this by taking the average index of each
215
+ // field in this group in the original ordering of fields. This is very
216
+ // approximate, but should put this group close to where its member fields
217
+ // originally went.
218
+ float preferred_location_;
219
+ vector<const FieldDescriptor*> fields_;
220
+ // We rely on the default copy constructor and operator= so this type can be
221
+ // used in a vector.
222
+ };
223
+
224
+ // Reorder 'fields' so that if the fields are output into a c++ class in the new
225
+ // order, the alignment padding is minimized. We try to do this while keeping
226
+ // each field as close as possible to its original position so that we don't
227
+ // reduce cache locality much for function that access each field in order.
228
+ void OptimizePadding(vector<const FieldDescriptor*>* fields) {
229
+ // First divide fields into those that align to 1 byte, 4 bytes or 8 bytes.
230
+ vector<FieldGroup> aligned_to_1, aligned_to_4, aligned_to_8;
231
+ for (int i = 0; i < fields->size(); ++i) {
232
+ switch (EstimateAlignmentSize((*fields)[i])) {
233
+ case 1: aligned_to_1.push_back(FieldGroup(i, (*fields)[i])); break;
234
+ case 4: aligned_to_4.push_back(FieldGroup(i, (*fields)[i])); break;
235
+ case 8: aligned_to_8.push_back(FieldGroup(i, (*fields)[i])); break;
236
+ default:
237
+ GOOGLE_LOG(FATAL) << "Unknown alignment size.";
238
+ }
239
+ }
240
+
241
+ // Now group fields aligned to 1 byte into sets of 4, and treat those like a
242
+ // single field aligned to 4 bytes.
243
+ for (int i = 0; i < aligned_to_1.size(); i += 4) {
244
+ FieldGroup field_group;
245
+ for (int j = i; j < aligned_to_1.size() && j < i + 4; ++j) {
246
+ field_group.Append(aligned_to_1[j]);
247
+ }
248
+ aligned_to_4.push_back(field_group);
249
+ }
250
+ // Sort by preferred location to keep fields as close to their original
251
+ // location as possible. Using stable_sort ensures that the output is
252
+ // consistent across runs.
253
+ stable_sort(aligned_to_4.begin(), aligned_to_4.end());
254
+
255
+ // Now group fields aligned to 4 bytes (or the 4-field groups created above)
256
+ // into pairs, and treat those like a single field aligned to 8 bytes.
257
+ for (int i = 0; i < aligned_to_4.size(); i += 2) {
258
+ FieldGroup field_group;
259
+ for (int j = i; j < aligned_to_4.size() && j < i + 2; ++j) {
260
+ field_group.Append(aligned_to_4[j]);
261
+ }
262
+ if (i == aligned_to_4.size() - 1) {
263
+ // Move incomplete 4-byte block to the end.
264
+ field_group.SetPreferredLocation(fields->size() + 1);
265
+ }
266
+ aligned_to_8.push_back(field_group);
267
+ }
268
+ // Sort by preferred location.
269
+ stable_sort(aligned_to_8.begin(), aligned_to_8.end());
270
+
271
+ // Now pull out all the FieldDescriptors in order.
272
+ fields->clear();
273
+ for (int i = 0; i < aligned_to_8.size(); ++i) {
274
+ fields->insert(fields->end(),
275
+ aligned_to_8[i].fields().begin(),
276
+ aligned_to_8[i].fields().end());
277
+ }
278
+ }
279
+
280
+ string MessageTypeProtoName(const FieldDescriptor* field) {
281
+ return field->message_type()->full_name();
282
+ }
283
+
284
+ }
285
+
286
+ // ===================================================================
287
+
288
+ MessageGenerator::MessageGenerator(const Descriptor* descriptor,
289
+ const Options& options)
290
+ : descriptor_(descriptor),
291
+ classname_(ClassName(descriptor, false)),
292
+ options_(options),
293
+ field_generators_(descriptor, options),
294
+ nested_generators_(new scoped_ptr<
295
+ MessageGenerator>[descriptor->nested_type_count()]),
296
+ enum_generators_(
297
+ new scoped_ptr<EnumGenerator>[descriptor->enum_type_count()]),
298
+ extension_generators_(new scoped_ptr<
299
+ ExtensionGenerator>[descriptor->extension_count()]) {
300
+
301
+ for (int i = 0; i < descriptor->nested_type_count(); i++) {
302
+ nested_generators_[i].reset(
303
+ new MessageGenerator(descriptor->nested_type(i), options));
304
+ }
305
+
306
+ for (int i = 0; i < descriptor->enum_type_count(); i++) {
307
+ enum_generators_[i].reset(
308
+ new EnumGenerator(descriptor->enum_type(i), options));
309
+ }
310
+
311
+ for (int i = 0; i < descriptor->extension_count(); i++) {
312
+ extension_generators_[i].reset(
313
+ new ExtensionGenerator(descriptor->extension(i), options));
314
+ }
315
+ }
316
+
317
+ MessageGenerator::~MessageGenerator() {}
318
+
319
+ void MessageGenerator::
320
+ GenerateForwardDeclaration(io::Printer* printer) {
321
+ printer->Print("class $classname$;\n",
322
+ "classname", classname_);
323
+
324
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
325
+ nested_generators_[i]->GenerateForwardDeclaration(printer);
326
+ }
327
+ }
328
+
329
+ void MessageGenerator::
330
+ GenerateEnumDefinitions(io::Printer* printer) {
331
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
332
+ nested_generators_[i]->GenerateEnumDefinitions(printer);
333
+ }
334
+
335
+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
336
+ enum_generators_[i]->GenerateDefinition(printer);
337
+ }
338
+ }
339
+
340
+ void MessageGenerator::
341
+ GenerateGetEnumDescriptorSpecializations(io::Printer* printer) {
342
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
343
+ nested_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
344
+ }
345
+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
346
+ enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer);
347
+ }
348
+ }
349
+
350
+ void MessageGenerator::
351
+ GenerateFieldAccessorDeclarations(io::Printer* printer) {
352
+ for (int i = 0; i < descriptor_->field_count(); i++) {
353
+ const FieldDescriptor* field = descriptor_->field(i);
354
+
355
+ PrintFieldComment(printer, field);
356
+
357
+ map<string, string> vars;
358
+ SetCommonFieldVariables(field, &vars, options_);
359
+ vars["constant_name"] = FieldConstantName(field);
360
+
361
+ if (field->is_repeated()) {
362
+ printer->Print(vars, "inline int $name$_size() const$deprecation$;\n");
363
+ } else {
364
+ printer->Print(vars, "inline bool has_$name$() const$deprecation$;\n");
365
+ }
366
+
367
+ printer->Print(vars, "inline void clear_$name$()$deprecation$;\n");
368
+ printer->Print(vars, "static const int $constant_name$ = $number$;\n");
369
+
370
+ // Generate type-specific accessor declarations.
371
+ field_generators_.get(field).GenerateAccessorDeclarations(printer);
372
+
373
+ printer->Print("\n");
374
+ }
375
+
376
+ if (descriptor_->extension_range_count() > 0) {
377
+ // Generate accessors for extensions. We just call a macro located in
378
+ // extension_set.h since the accessors about 80 lines of static code.
379
+ printer->Print(
380
+ "GOOGLE_PROTOBUF_EXTENSION_ACCESSORS($classname$)\n",
381
+ "classname", classname_);
382
+ }
383
+
384
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
385
+ printer->Print(
386
+ "inline $camel_oneof_name$Case $oneof_name$_case() const;\n",
387
+ "camel_oneof_name",
388
+ UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true),
389
+ "oneof_name", descriptor_->oneof_decl(i)->name());
390
+ }
391
+ }
392
+
393
+ void MessageGenerator::
394
+ GenerateFieldAccessorDefinitions(io::Printer* printer) {
395
+ printer->Print("// $classname$\n\n", "classname", classname_);
396
+
397
+ for (int i = 0; i < descriptor_->field_count(); i++) {
398
+ const FieldDescriptor* field = descriptor_->field(i);
399
+
400
+ PrintFieldComment(printer, field);
401
+
402
+ map<string, string> vars;
403
+ SetCommonFieldVariables(field, &vars, options_);
404
+
405
+ // Generate has_$name$() or $name$_size().
406
+ if (field->is_repeated()) {
407
+ printer->Print(vars,
408
+ "inline int $classname$::$name$_size() const {\n"
409
+ " return $name$_.size();\n"
410
+ "}\n");
411
+ } else if (field->containing_oneof()) {
412
+ // Singular field in a oneof
413
+ vars["field_name"] = UnderscoresToCamelCase(field->name(), true);
414
+ vars["oneof_name"] = field->containing_oneof()->name();
415
+ vars["oneof_index"] = SimpleItoa(field->containing_oneof()->index());
416
+ printer->Print(vars,
417
+ "inline bool $classname$::has_$name$() const {\n"
418
+ " return $oneof_name$_case() == k$field_name$;\n"
419
+ "}\n"
420
+ "inline void $classname$::set_has_$name$() {\n"
421
+ " _oneof_case_[$oneof_index$] = k$field_name$;\n"
422
+ "}\n");
423
+ } else {
424
+ // Singular field.
425
+ char buffer[kFastToBufferSize];
426
+ vars["has_array_index"] = SimpleItoa(field->index() / 32);
427
+ vars["has_mask"] = FastHex32ToBuffer(1u << (field->index() % 32), buffer);
428
+ printer->Print(vars,
429
+ "inline bool $classname$::has_$name$() const {\n"
430
+ " return (_has_bits_[$has_array_index$] & 0x$has_mask$u) != 0;\n"
431
+ "}\n"
432
+ "inline void $classname$::set_has_$name$() {\n"
433
+ " _has_bits_[$has_array_index$] |= 0x$has_mask$u;\n"
434
+ "}\n"
435
+ "inline void $classname$::clear_has_$name$() {\n"
436
+ " _has_bits_[$has_array_index$] &= ~0x$has_mask$u;\n"
437
+ "}\n"
438
+ );
439
+ }
440
+
441
+ // Generate clear_$name$()
442
+ printer->Print(vars,
443
+ "inline void $classname$::clear_$name$() {\n");
444
+
445
+ printer->Indent();
446
+
447
+ if (field->containing_oneof()) {
448
+ // Clear this field only if it is the active field in this oneof,
449
+ // otherwise ignore
450
+ printer->Print(vars,
451
+ "if (has_$name$()) {\n");
452
+ printer->Indent();
453
+ field_generators_.get(field).GenerateClearingCode(printer);
454
+ printer->Print(vars,
455
+ "clear_has_$oneof_name$();\n");
456
+ printer->Outdent();
457
+ printer->Print("}\n");
458
+ } else {
459
+ field_generators_.get(field).GenerateClearingCode(printer);
460
+ if (!field->is_repeated()) {
461
+ printer->Print(vars,
462
+ "clear_has_$name$();\n");
463
+ }
464
+ }
465
+
466
+ printer->Outdent();
467
+ printer->Print("}\n");
468
+
469
+ // Generate type-specific accessors.
470
+ field_generators_.get(field).GenerateInlineAccessorDefinitions(printer);
471
+
472
+ printer->Print("\n");
473
+ }
474
+
475
+ // Generate has_$name$() and clear_has_$name$() functions for oneofs
476
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
477
+ map<string, string> vars;
478
+ vars["oneof_name"] = descriptor_->oneof_decl(i)->name();
479
+ vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
480
+ vars["cap_oneof_name"] =
481
+ ToUpper(descriptor_->oneof_decl(i)->name());
482
+ vars["classname"] = classname_;
483
+ printer->Print(
484
+ vars,
485
+ "inline bool $classname$::has_$oneof_name$() {\n"
486
+ " return $oneof_name$_case() != $cap_oneof_name$_NOT_SET;\n"
487
+ "}\n"
488
+ "inline void $classname$::clear_has_$oneof_name$() {\n"
489
+ " _oneof_case_[$oneof_index$] = $cap_oneof_name$_NOT_SET;\n"
490
+ "}\n");
491
+ }
492
+ }
493
+
494
+ // Helper for the code that emits the Clear() method.
495
+ static bool CanClearByZeroing(const FieldDescriptor* field) {
496
+ if (field->is_repeated() || field->is_extension()) return false;
497
+ switch (field->cpp_type()) {
498
+ case internal::WireFormatLite::CPPTYPE_ENUM:
499
+ return field->default_value_enum()->number() == 0;
500
+ case internal::WireFormatLite::CPPTYPE_INT32:
501
+ return field->default_value_int32() == 0;
502
+ case internal::WireFormatLite::CPPTYPE_INT64:
503
+ return field->default_value_int64() == 0;
504
+ case internal::WireFormatLite::CPPTYPE_UINT32:
505
+ return field->default_value_uint32() == 0;
506
+ case internal::WireFormatLite::CPPTYPE_UINT64:
507
+ return field->default_value_uint64() == 0;
508
+ case internal::WireFormatLite::CPPTYPE_FLOAT:
509
+ return field->default_value_float() == 0;
510
+ case internal::WireFormatLite::CPPTYPE_DOUBLE:
511
+ return field->default_value_double() == 0;
512
+ case internal::WireFormatLite::CPPTYPE_BOOL:
513
+ return field->default_value_bool() == false;
514
+ default:
515
+ return false;
516
+ }
517
+ }
518
+
519
+ void MessageGenerator::
520
+ GenerateClassDefinition(io::Printer* printer) {
521
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
522
+ nested_generators_[i]->GenerateClassDefinition(printer);
523
+ printer->Print("\n");
524
+ printer->Print(kThinSeparator);
525
+ printer->Print("\n");
526
+ }
527
+
528
+ map<string, string> vars;
529
+ vars["classname"] = classname_;
530
+ vars["field_count"] = SimpleItoa(descriptor_->field_count());
531
+ vars["oneof_decl_count"] = SimpleItoa(descriptor_->oneof_decl_count());
532
+ if (options_.dllexport_decl.empty()) {
533
+ vars["dllexport"] = "";
534
+ } else {
535
+ vars["dllexport"] = options_.dllexport_decl + " ";
536
+ }
537
+ vars["superclass"] = SuperClassName(descriptor_);
538
+
539
+ printer->Print(vars,
540
+ "class $dllexport$$classname$ : public $superclass$ {\n"
541
+ " public:\n");
542
+ printer->Indent();
543
+
544
+ printer->Print(vars,
545
+ "$classname$();\n"
546
+ "virtual ~$classname$();\n"
547
+ "\n"
548
+ "$classname$(const $classname$& from);\n"
549
+ "\n"
550
+ "inline $classname$& operator=(const $classname$& from) {\n"
551
+ " CopyFrom(from);\n"
552
+ " return *this;\n"
553
+ "}\n"
554
+ "\n");
555
+
556
+ if (UseUnknownFieldSet(descriptor_->file())) {
557
+ printer->Print(
558
+ "inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n"
559
+ " return _unknown_fields_;\n"
560
+ "}\n"
561
+ "\n"
562
+ "inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n"
563
+ " return &_unknown_fields_;\n"
564
+ "}\n"
565
+ "\n");
566
+ } else {
567
+ printer->Print(
568
+ "inline const ::std::string& unknown_fields() const {\n"
569
+ " return _unknown_fields_;\n"
570
+ "}\n"
571
+ "\n"
572
+ "inline ::std::string* mutable_unknown_fields() {\n"
573
+ " return &_unknown_fields_;\n"
574
+ "}\n"
575
+ "\n");
576
+ }
577
+
578
+ // Only generate this member if it's not disabled.
579
+ if (HasDescriptorMethods(descriptor_->file()) &&
580
+ !descriptor_->options().no_standard_descriptor_accessor()) {
581
+ printer->Print(vars,
582
+ "static const ::google::protobuf::Descriptor* descriptor();\n");
583
+ }
584
+
585
+ printer->Print(vars,
586
+ "static const $classname$& default_instance();\n"
587
+ "\n");
588
+
589
+ // Generate enum values for every field in oneofs. One list is generated for
590
+ // each oneof with an additional *_NOT_SET value.
591
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
592
+ printer->Print(
593
+ "enum $camel_oneof_name$Case {\n",
594
+ "camel_oneof_name",
595
+ UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true));
596
+ printer->Indent();
597
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
598
+ printer->Print(
599
+ "k$field_name$ = $field_number$,\n",
600
+ "field_name",
601
+ UnderscoresToCamelCase(
602
+ descriptor_->oneof_decl(i)->field(j)->name(), true),
603
+ "field_number",
604
+ SimpleItoa(descriptor_->oneof_decl(i)->field(j)->number()));
605
+ }
606
+ printer->Print(
607
+ "$cap_oneof_name$_NOT_SET = 0,\n",
608
+ "cap_oneof_name",
609
+ ToUpper(descriptor_->oneof_decl(i)->name()));
610
+ printer->Outdent();
611
+ printer->Print(
612
+ "};\n"
613
+ "\n");
614
+ }
615
+
616
+ if (!StaticInitializersForced(descriptor_->file())) {
617
+ printer->Print(vars,
618
+ "#ifdef GOOGLE_PROTOBUF_NO_STATIC_INITIALIZER\n"
619
+ "// Returns the internal default instance pointer. This function can\n"
620
+ "// return NULL thus should not be used by the user. This is intended\n"
621
+ "// for Protobuf internal code. Please use default_instance() declared\n"
622
+ "// above instead.\n"
623
+ "static inline const $classname$* internal_default_instance() {\n"
624
+ " return default_instance_;\n"
625
+ "}\n"
626
+ "#endif\n"
627
+ "\n");
628
+ }
629
+
630
+
631
+ printer->Print(vars,
632
+ "void Swap($classname$* other);\n"
633
+ "\n"
634
+ "// implements Message ----------------------------------------------\n"
635
+ "\n"
636
+ "$classname$* New() const;\n");
637
+
638
+ if (HasGeneratedMethods(descriptor_->file())) {
639
+ if (HasDescriptorMethods(descriptor_->file())) {
640
+ printer->Print(vars,
641
+ "void CopyFrom(const ::google::protobuf::Message& from);\n"
642
+ "void MergeFrom(const ::google::protobuf::Message& from);\n");
643
+ } else {
644
+ printer->Print(vars,
645
+ "void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);\n");
646
+ }
647
+
648
+ printer->Print(vars,
649
+ "void CopyFrom(const $classname$& from);\n"
650
+ "void MergeFrom(const $classname$& from);\n"
651
+ "void Clear();\n"
652
+ "bool IsInitialized() const;\n"
653
+ "\n"
654
+ "int ByteSize() const;\n"
655
+ "bool MergePartialFromCodedStream(\n"
656
+ " ::google::protobuf::io::CodedInputStream* input);\n"
657
+ "void SerializeWithCachedSizes(\n"
658
+ " ::google::protobuf::io::CodedOutputStream* output) const;\n");
659
+ // DiscardUnknownFields() is implemented in message.cc using reflections. We
660
+ // need to implement this function in generated code for messages.
661
+ if (!UseUnknownFieldSet(descriptor_->file())) {
662
+ printer->Print(
663
+ "void DiscardUnknownFields();\n");
664
+ }
665
+ if (HasFastArraySerialization(descriptor_->file())) {
666
+ printer->Print(
667
+ "::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n");
668
+ }
669
+ }
670
+
671
+ // Check all FieldDescriptors including those in oneofs to estimate
672
+ // whether ::std::string is likely to be used, and depending on that
673
+ // estimate, set uses_string_ to true or false. That contols
674
+ // whether to force initialization of empty_string_ in SharedCtor().
675
+ // It's often advantageous to do so to keep "is empty_string_
676
+ // inited?" code from appearing all over the place.
677
+ vector<const FieldDescriptor*> descriptors;
678
+ for (int i = 0; i < descriptor_->field_count(); i++) {
679
+ descriptors.push_back(descriptor_->field(i));
680
+ }
681
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
682
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
683
+ descriptors.push_back(descriptor_->oneof_decl(i)->field(j));
684
+ }
685
+ }
686
+ uses_string_ = false;
687
+ for (int i = 0; i < descriptors.size(); i++) {
688
+ const FieldDescriptor* field = descriptors[i];
689
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) {
690
+ switch (field->options().ctype()) {
691
+ default: uses_string_ = true; break;
692
+ }
693
+ }
694
+ }
695
+
696
+ printer->Print(
697
+ "int GetCachedSize() const { return _cached_size_; }\n"
698
+ "private:\n"
699
+ "void SharedCtor();\n"
700
+ "void SharedDtor();\n"
701
+ "void SetCachedSize(int size) const;\n"
702
+ "public:\n");
703
+
704
+ if (HasDescriptorMethods(descriptor_->file())) {
705
+ printer->Print(
706
+ "::google::protobuf::Metadata GetMetadata() const;\n"
707
+ "\n");
708
+ } else {
709
+ printer->Print(
710
+ "::std::string GetTypeName() const;\n"
711
+ "\n");
712
+ }
713
+
714
+ printer->Print(
715
+ "// nested types ----------------------------------------------------\n"
716
+ "\n");
717
+
718
+ // Import all nested message classes into this class's scope with typedefs.
719
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
720
+ const Descriptor* nested_type = descriptor_->nested_type(i);
721
+ printer->Print("typedef $nested_full_name$ $nested_name$;\n",
722
+ "nested_name", nested_type->name(),
723
+ "nested_full_name", ClassName(nested_type, false));
724
+ }
725
+
726
+ if (descriptor_->nested_type_count() > 0) {
727
+ printer->Print("\n");
728
+ }
729
+
730
+ // Import all nested enums and their values into this class's scope with
731
+ // typedefs and constants.
732
+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
733
+ enum_generators_[i]->GenerateSymbolImports(printer);
734
+ printer->Print("\n");
735
+ }
736
+
737
+ printer->Print(
738
+ "// accessors -------------------------------------------------------\n"
739
+ "\n");
740
+
741
+ // Generate accessor methods for all fields.
742
+ GenerateFieldAccessorDeclarations(printer);
743
+
744
+ // Declare extension identifiers.
745
+ for (int i = 0; i < descriptor_->extension_count(); i++) {
746
+ extension_generators_[i]->GenerateDeclaration(printer);
747
+ }
748
+
749
+
750
+ printer->Print(
751
+ "// @@protoc_insertion_point(class_scope:$full_name$)\n",
752
+ "full_name", descriptor_->full_name());
753
+
754
+ // Generate private members.
755
+ printer->Outdent();
756
+ printer->Print(" private:\n");
757
+ printer->Indent();
758
+
759
+
760
+ for (int i = 0; i < descriptor_->field_count(); i++) {
761
+ if (!descriptor_->field(i)->is_repeated()) {
762
+ printer->Print(
763
+ "inline void set_has_$name$();\n",
764
+ "name", FieldName(descriptor_->field(i)));
765
+ if (!descriptor_->field(i)->containing_oneof()) {
766
+ printer->Print(
767
+ "inline void clear_has_$name$();\n",
768
+ "name", FieldName(descriptor_->field(i)));
769
+ }
770
+ }
771
+ }
772
+ printer->Print("\n");
773
+
774
+ // Generate oneof function declarations
775
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
776
+ printer->Print(
777
+ "inline bool has_$oneof_name$();\n"
778
+ "void clear_$oneof_name$();\n"
779
+ "inline void clear_has_$oneof_name$();\n\n",
780
+ "oneof_name", descriptor_->oneof_decl(i)->name());
781
+ }
782
+
783
+ // Prepare decls for _cached_size_ and _has_bits_. Their position in the
784
+ // output will be determined later.
785
+
786
+ bool need_to_emit_cached_size = true;
787
+ // TODO(kenton): Make _cached_size_ an atomic<int> when C++ supports it.
788
+ const string cached_size_decl = "mutable int _cached_size_;\n";
789
+
790
+ // TODO(jieluo) - Optimize _has_bits_ for repeated and oneof fields.
791
+ size_t sizeof_has_bits = (descriptor_->field_count() + 31) / 32 * 4;
792
+ if (descriptor_->field_count() == 0) {
793
+ // Zero-size arrays aren't technically allowed, and MSVC in particular
794
+ // doesn't like them. We still need to declare these arrays to make
795
+ // other code compile. Since this is an uncommon case, we'll just declare
796
+ // them with size 1 and waste some space. Oh well.
797
+ sizeof_has_bits = 4;
798
+ }
799
+ const string has_bits_decl = sizeof_has_bits == 0 ? "" :
800
+ "::google::protobuf::uint32 _has_bits_[" + SimpleItoa(sizeof_has_bits / 4) + "];\n";
801
+
802
+
803
+ // To minimize padding, data members are divided into three sections:
804
+ // (1) members assumed to align to 8 bytes
805
+ // (2) members corresponding to message fields, re-ordered to optimize
806
+ // alignment.
807
+ // (3) members assumed to align to 4 bytes.
808
+
809
+ // Members assumed to align to 8 bytes:
810
+
811
+ if (descriptor_->extension_range_count() > 0) {
812
+ printer->Print(
813
+ "::google::protobuf::internal::ExtensionSet _extensions_;\n"
814
+ "\n");
815
+ }
816
+
817
+ if (UseUnknownFieldSet(descriptor_->file())) {
818
+ printer->Print(
819
+ "::google::protobuf::UnknownFieldSet _unknown_fields_;\n"
820
+ "\n");
821
+ } else {
822
+ printer->Print(
823
+ "::std::string _unknown_fields_;\n"
824
+ "\n");
825
+ }
826
+
827
+ // _has_bits_ is frequently accessed, so to reduce code size and improve
828
+ // speed, it should be close to the start of the object. But, try not to
829
+ // waste space:_has_bits_ by itself always makes sense if its size is a
830
+ // multiple of 8, but, otherwise, maybe _has_bits_ and cached_size_ together
831
+ // will work well.
832
+ printer->Print(has_bits_decl.c_str());
833
+ if ((sizeof_has_bits % 8) != 0) {
834
+ printer->Print(cached_size_decl.c_str());
835
+ need_to_emit_cached_size = false;
836
+ }
837
+
838
+ // Field members:
839
+
840
+ // List fields which doesn't belong to any oneof
841
+ vector<const FieldDescriptor*> fields;
842
+ hash_map<string, int> fieldname_to_chunk;
843
+ for (int i = 0; i < descriptor_->field_count(); i++) {
844
+ if (!descriptor_->field(i)->containing_oneof()) {
845
+ const FieldDescriptor* field = descriptor_->field(i);
846
+ fields.push_back(field);
847
+ fieldname_to_chunk[FieldName(field)] = i / 8;
848
+ }
849
+ }
850
+ OptimizePadding(&fields);
851
+ // Emit some private and static members
852
+ runs_of_fields_ = vector< vector<string> >(1);
853
+ for (int i = 0; i < fields.size(); ++i) {
854
+ const FieldDescriptor* field = fields[i];
855
+ const FieldGenerator& generator = field_generators_.get(field);
856
+ generator.GenerateStaticMembers(printer);
857
+ generator.GeneratePrivateMembers(printer);
858
+ if (CanClearByZeroing(field)) {
859
+ const string& fieldname = FieldName(field);
860
+ if (!runs_of_fields_.back().empty() &&
861
+ (fieldname_to_chunk[runs_of_fields_.back().back()] !=
862
+ fieldname_to_chunk[fieldname])) {
863
+ runs_of_fields_.push_back(vector<string>());
864
+ }
865
+ runs_of_fields_.back().push_back(fieldname);
866
+ } else if (!runs_of_fields_.back().empty()) {
867
+ runs_of_fields_.push_back(vector<string>());
868
+ }
869
+ }
870
+
871
+ // For each oneof generate a union
872
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
873
+ printer->Print(
874
+ "union $camel_oneof_name$Union {\n",
875
+ "camel_oneof_name",
876
+ UnderscoresToCamelCase(descriptor_->oneof_decl(i)->name(), true));
877
+ printer->Indent();
878
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
879
+ field_generators_.get(descriptor_->oneof_decl(i)->
880
+ field(j)).GeneratePrivateMembers(printer);
881
+ }
882
+ printer->Outdent();
883
+ printer->Print(
884
+ "} $oneof_name$_;\n",
885
+ "oneof_name", descriptor_->oneof_decl(i)->name());
886
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
887
+ field_generators_.get(descriptor_->oneof_decl(i)->
888
+ field(j)).GenerateStaticMembers(printer);
889
+ }
890
+ }
891
+
892
+ // Members assumed to align to 4 bytes:
893
+
894
+ if (need_to_emit_cached_size) {
895
+ printer->Print(cached_size_decl.c_str());
896
+ need_to_emit_cached_size = false;
897
+ }
898
+
899
+ // Generate _oneof_case_.
900
+ if (descriptor_->oneof_decl_count() > 0) {
901
+ printer->Print(vars,
902
+ "::google::protobuf::uint32 _oneof_case_[$oneof_decl_count$];\n"
903
+ "\n");
904
+ }
905
+
906
+ // Declare AddDescriptors(), BuildDescriptors(), and ShutdownFile() as
907
+ // friends so that they can access private static variables like
908
+ // default_instance_ and reflection_.
909
+ PrintHandlingOptionalStaticInitializers(
910
+ descriptor_->file(), printer,
911
+ // With static initializers.
912
+ "friend void $dllexport_decl$ $adddescriptorsname$();\n",
913
+ // Without.
914
+ "friend void $dllexport_decl$ $adddescriptorsname$_impl();\n",
915
+ // Vars.
916
+ "dllexport_decl", options_.dllexport_decl,
917
+ "adddescriptorsname",
918
+ GlobalAddDescriptorsName(descriptor_->file()->name()));
919
+
920
+ printer->Print(
921
+ "friend void $assigndescriptorsname$();\n"
922
+ "friend void $shutdownfilename$();\n"
923
+ "\n",
924
+ "assigndescriptorsname",
925
+ GlobalAssignDescriptorsName(descriptor_->file()->name()),
926
+ "shutdownfilename", GlobalShutdownFileName(descriptor_->file()->name()));
927
+
928
+ printer->Print(
929
+ "void InitAsDefaultInstance();\n"
930
+ "static $classname$* default_instance_;\n",
931
+ "classname", classname_);
932
+
933
+ printer->Outdent();
934
+ printer->Print(vars, "};");
935
+ GOOGLE_DCHECK(!need_to_emit_cached_size);
936
+ }
937
+
938
+ void MessageGenerator::
939
+ GenerateInlineMethods(io::Printer* printer) {
940
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
941
+ nested_generators_[i]->GenerateInlineMethods(printer);
942
+ printer->Print(kThinSeparator);
943
+ printer->Print("\n");
944
+ }
945
+
946
+ GenerateFieldAccessorDefinitions(printer);
947
+
948
+ // Generate oneof_case() functions.
949
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
950
+ map<string, string> vars;
951
+ vars["class_name"] = classname_;
952
+ vars["camel_oneof_name"] = UnderscoresToCamelCase(
953
+ descriptor_->oneof_decl(i)->name(), true);
954
+ vars["oneof_name"] = descriptor_->oneof_decl(i)->name();
955
+ vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index());
956
+ printer->Print(
957
+ vars,
958
+ "inline $class_name$::$camel_oneof_name$Case $class_name$::"
959
+ "$oneof_name$_case() const {\n"
960
+ " return $class_name$::$camel_oneof_name$Case("
961
+ "_oneof_case_[$oneof_index$]);\n"
962
+ "}\n");
963
+ }
964
+ }
965
+
966
+ void MessageGenerator::
967
+ GenerateDescriptorDeclarations(io::Printer* printer) {
968
+ printer->Print(
969
+ "const ::google::protobuf::Descriptor* $name$_descriptor_ = NULL;\n"
970
+ "const ::google::protobuf::internal::GeneratedMessageReflection*\n"
971
+ " $name$_reflection_ = NULL;\n",
972
+ "name", classname_);
973
+
974
+ // Generate oneof default instance for reflection usage.
975
+ if (descriptor_->oneof_decl_count() > 0) {
976
+ printer->Print("struct $name$OneofInstance {\n",
977
+ "name", classname_);
978
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
979
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
980
+ const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
981
+ printer->Print(" ");
982
+ if (IsStringOrMessage(field)) {
983
+ printer->Print("const ");
984
+ }
985
+ field_generators_.get(field).GeneratePrivateMembers(printer);
986
+ }
987
+ }
988
+
989
+ printer->Print("}* $name$_default_oneof_instance_ = NULL;\n",
990
+ "name", classname_);
991
+ }
992
+
993
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
994
+ nested_generators_[i]->GenerateDescriptorDeclarations(printer);
995
+ }
996
+
997
+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
998
+ printer->Print(
999
+ "const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\n",
1000
+ "name", ClassName(descriptor_->enum_type(i), false));
1001
+ }
1002
+ }
1003
+
1004
+ void MessageGenerator::
1005
+ GenerateDescriptorInitializer(io::Printer* printer, int index) {
1006
+ // TODO(kenton): Passing the index to this method is redundant; just use
1007
+ // descriptor_->index() instead.
1008
+ map<string, string> vars;
1009
+ vars["classname"] = classname_;
1010
+ vars["index"] = SimpleItoa(index);
1011
+
1012
+ // Obtain the descriptor from the parent's descriptor.
1013
+ if (descriptor_->containing_type() == NULL) {
1014
+ printer->Print(vars,
1015
+ "$classname$_descriptor_ = file->message_type($index$);\n");
1016
+ } else {
1017
+ vars["parent"] = ClassName(descriptor_->containing_type(), false);
1018
+ printer->Print(vars,
1019
+ "$classname$_descriptor_ = "
1020
+ "$parent$_descriptor_->nested_type($index$);\n");
1021
+ }
1022
+
1023
+ // Generate the offsets.
1024
+ GenerateOffsets(printer);
1025
+
1026
+ // Construct the reflection object.
1027
+ printer->Print(vars,
1028
+ "$classname$_reflection_ =\n"
1029
+ " new ::google::protobuf::internal::GeneratedMessageReflection(\n"
1030
+ " $classname$_descriptor_,\n"
1031
+ " $classname$::default_instance_,\n"
1032
+ " $classname$_offsets_,\n"
1033
+ " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, _has_bits_[0]),\n"
1034
+ " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
1035
+ "$classname$, _unknown_fields_),\n");
1036
+ if (descriptor_->extension_range_count() > 0) {
1037
+ printer->Print(vars,
1038
+ " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
1039
+ "$classname$, _extensions_),\n");
1040
+ } else {
1041
+ // No extensions.
1042
+ printer->Print(vars,
1043
+ " -1,\n");
1044
+ }
1045
+
1046
+ if (descriptor_->oneof_decl_count() > 0) {
1047
+ printer->Print(vars,
1048
+ " $classname$_default_oneof_instance_,\n"
1049
+ " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET("
1050
+ "$classname$, _oneof_case_[0]),\n");
1051
+ }
1052
+
1053
+ printer->Print(
1054
+ " ::google::protobuf::DescriptorPool::generated_pool(),\n");
1055
+ printer->Print(vars,
1056
+ " ::google::protobuf::MessageFactory::generated_factory(),\n");
1057
+ printer->Print(vars,
1058
+ " sizeof($classname$));\n");
1059
+
1060
+ // Handle nested types.
1061
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
1062
+ nested_generators_[i]->GenerateDescriptorInitializer(printer, i);
1063
+ }
1064
+
1065
+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
1066
+ enum_generators_[i]->GenerateDescriptorInitializer(printer, i);
1067
+ }
1068
+ }
1069
+
1070
+ void MessageGenerator::
1071
+ GenerateTypeRegistrations(io::Printer* printer) {
1072
+ // Register this message type with the message factory.
1073
+ printer->Print(
1074
+ "::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n"
1075
+ " $classname$_descriptor_, &$classname$::default_instance());\n",
1076
+ "classname", classname_);
1077
+
1078
+ // Handle nested types.
1079
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
1080
+ nested_generators_[i]->GenerateTypeRegistrations(printer);
1081
+ }
1082
+ }
1083
+
1084
+ void MessageGenerator::
1085
+ GenerateDefaultInstanceAllocator(io::Printer* printer) {
1086
+ // Construct the default instances of all fields, as they will be used
1087
+ // when creating the default instance of the entire message.
1088
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1089
+ field_generators_.get(descriptor_->field(i))
1090
+ .GenerateDefaultInstanceAllocator(printer);
1091
+ }
1092
+
1093
+ // Construct the default instance. We can't call InitAsDefaultInstance() yet
1094
+ // because we need to make sure all default instances that this one might
1095
+ // depend on are constructed first.
1096
+ printer->Print(
1097
+ "$classname$::default_instance_ = new $classname$();\n",
1098
+ "classname", classname_);
1099
+
1100
+ if ((descriptor_->oneof_decl_count() > 0) &&
1101
+ HasDescriptorMethods(descriptor_->file())) {
1102
+ printer->Print(
1103
+ "$classname$_default_oneof_instance_ = new $classname$OneofInstance;\n",
1104
+ "classname", classname_);
1105
+ }
1106
+
1107
+ // Handle nested types.
1108
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
1109
+ nested_generators_[i]->GenerateDefaultInstanceAllocator(printer);
1110
+ }
1111
+
1112
+ }
1113
+
1114
+ void MessageGenerator::
1115
+ GenerateDefaultInstanceInitializer(io::Printer* printer) {
1116
+ printer->Print(
1117
+ "$classname$::default_instance_->InitAsDefaultInstance();\n",
1118
+ "classname", classname_);
1119
+
1120
+ // Register extensions.
1121
+ for (int i = 0; i < descriptor_->extension_count(); i++) {
1122
+ extension_generators_[i]->GenerateRegistration(printer);
1123
+ }
1124
+
1125
+ // Handle nested types.
1126
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
1127
+ nested_generators_[i]->GenerateDefaultInstanceInitializer(printer);
1128
+ }
1129
+ }
1130
+
1131
+ void MessageGenerator::
1132
+ GenerateShutdownCode(io::Printer* printer) {
1133
+ printer->Print(
1134
+ "delete $classname$::default_instance_;\n",
1135
+ "classname", classname_);
1136
+
1137
+ if (HasDescriptorMethods(descriptor_->file())) {
1138
+ if (descriptor_->oneof_decl_count() > 0) {
1139
+ printer->Print(
1140
+ "delete $classname$_default_oneof_instance_;\n",
1141
+ "classname", classname_);
1142
+ }
1143
+ printer->Print(
1144
+ "delete $classname$_reflection_;\n",
1145
+ "classname", classname_);
1146
+ }
1147
+
1148
+ // Handle default instances of fields.
1149
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1150
+ field_generators_.get(descriptor_->field(i))
1151
+ .GenerateShutdownCode(printer);
1152
+ }
1153
+
1154
+ // Handle nested types.
1155
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
1156
+ nested_generators_[i]->GenerateShutdownCode(printer);
1157
+ }
1158
+ }
1159
+
1160
+ void MessageGenerator::
1161
+ GenerateClassMethods(io::Printer* printer) {
1162
+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
1163
+ enum_generators_[i]->GenerateMethods(printer);
1164
+ }
1165
+
1166
+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
1167
+ nested_generators_[i]->GenerateClassMethods(printer);
1168
+ printer->Print("\n");
1169
+ printer->Print(kThinSeparator);
1170
+ printer->Print("\n");
1171
+ }
1172
+
1173
+ // Generate non-inline field definitions.
1174
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1175
+ field_generators_.get(descriptor_->field(i))
1176
+ .GenerateNonInlineAccessorDefinitions(printer);
1177
+ }
1178
+
1179
+ // Generate field number constants.
1180
+ printer->Print("#ifndef _MSC_VER\n");
1181
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1182
+ const FieldDescriptor *field = descriptor_->field(i);
1183
+ printer->Print(
1184
+ "const int $classname$::$constant_name$;\n",
1185
+ "classname", ClassName(FieldScope(field), false),
1186
+ "constant_name", FieldConstantName(field));
1187
+ }
1188
+ printer->Print(
1189
+ "#endif // !_MSC_VER\n"
1190
+ "\n");
1191
+
1192
+ // Define extension identifiers.
1193
+ for (int i = 0; i < descriptor_->extension_count(); i++) {
1194
+ extension_generators_[i]->GenerateDefinition(printer);
1195
+ }
1196
+
1197
+ GenerateStructors(printer);
1198
+ printer->Print("\n");
1199
+
1200
+ if (descriptor_->oneof_decl_count() > 0) {
1201
+ GenerateOneofClear(printer);
1202
+ printer->Print("\n");
1203
+ }
1204
+
1205
+ if (HasGeneratedMethods(descriptor_->file())) {
1206
+ GenerateClear(printer);
1207
+ printer->Print("\n");
1208
+
1209
+ GenerateMergeFromCodedStream(printer);
1210
+ printer->Print("\n");
1211
+
1212
+ GenerateSerializeWithCachedSizes(printer);
1213
+ printer->Print("\n");
1214
+
1215
+ if (HasFastArraySerialization(descriptor_->file())) {
1216
+ GenerateSerializeWithCachedSizesToArray(printer);
1217
+ printer->Print("\n");
1218
+ }
1219
+
1220
+ GenerateByteSize(printer);
1221
+ printer->Print("\n");
1222
+
1223
+ GenerateMergeFrom(printer);
1224
+ printer->Print("\n");
1225
+
1226
+ GenerateCopyFrom(printer);
1227
+ printer->Print("\n");
1228
+
1229
+ GenerateIsInitialized(printer);
1230
+ printer->Print("\n");
1231
+ }
1232
+
1233
+ GenerateSwap(printer);
1234
+ printer->Print("\n");
1235
+
1236
+ if (HasDescriptorMethods(descriptor_->file())) {
1237
+ printer->Print(
1238
+ "::google::protobuf::Metadata $classname$::GetMetadata() const {\n"
1239
+ " protobuf_AssignDescriptorsOnce();\n"
1240
+ " ::google::protobuf::Metadata metadata;\n"
1241
+ " metadata.descriptor = $classname$_descriptor_;\n"
1242
+ " metadata.reflection = $classname$_reflection_;\n"
1243
+ " return metadata;\n"
1244
+ "}\n"
1245
+ "\n",
1246
+ "classname", classname_);
1247
+ } else {
1248
+ printer->Print(
1249
+ "::std::string $classname$::GetTypeName() const {\n"
1250
+ " return \"$type_name$\";\n"
1251
+ "}\n"
1252
+ "\n",
1253
+ "classname", classname_,
1254
+ "type_name", descriptor_->full_name());
1255
+ }
1256
+
1257
+ }
1258
+
1259
+ void MessageGenerator::
1260
+ GenerateOffsets(io::Printer* printer) {
1261
+ printer->Print(
1262
+ "static const int $classname$_offsets_[$field_count$] = {\n",
1263
+ "classname", classname_,
1264
+ "field_count", SimpleItoa(max(
1265
+ 1, descriptor_->field_count() + descriptor_->oneof_decl_count())));
1266
+ printer->Indent();
1267
+
1268
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1269
+ const FieldDescriptor* field = descriptor_->field(i);
1270
+ if (field->containing_oneof()) {
1271
+ printer->Print(
1272
+ "PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET("
1273
+ "$classname$_default_oneof_instance_, $name$_),\n",
1274
+ "classname", classname_,
1275
+ "name", FieldName(field));
1276
+ } else {
1277
+ printer->Print(
1278
+ "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, "
1279
+ "$name$_),\n",
1280
+ "classname", classname_,
1281
+ "name", FieldName(field));
1282
+ }
1283
+ }
1284
+
1285
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
1286
+ const OneofDescriptor* oneof = descriptor_->oneof_decl(i);
1287
+ printer->Print(
1288
+ "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, $name$_),\n",
1289
+ "classname", classname_,
1290
+ "name", oneof->name());
1291
+ }
1292
+
1293
+ printer->Outdent();
1294
+ printer->Print("};\n");
1295
+ }
1296
+
1297
+ void MessageGenerator::
1298
+ GenerateSharedConstructorCode(io::Printer* printer) {
1299
+ printer->Print(
1300
+ "void $classname$::SharedCtor() {\n",
1301
+ "classname", classname_);
1302
+ printer->Indent();
1303
+
1304
+ printer->Print(StrCat(
1305
+ uses_string_ ? "::google::protobuf::internal::GetEmptyString();\n" : "",
1306
+ "_cached_size_ = 0;\n").c_str());
1307
+
1308
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1309
+ if (!descriptor_->field(i)->containing_oneof()) {
1310
+ field_generators_.get(descriptor_->field(i))
1311
+ .GenerateConstructorCode(printer);
1312
+ }
1313
+ }
1314
+
1315
+ printer->Print(
1316
+ "::memset(_has_bits_, 0, sizeof(_has_bits_));\n");
1317
+
1318
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
1319
+ printer->Print(
1320
+ "clear_has_$oneof_name$();\n",
1321
+ "oneof_name", descriptor_->oneof_decl(i)->name());
1322
+ }
1323
+
1324
+ printer->Outdent();
1325
+ printer->Print("}\n\n");
1326
+ }
1327
+
1328
+ void MessageGenerator::
1329
+ GenerateSharedDestructorCode(io::Printer* printer) {
1330
+ printer->Print(
1331
+ "void $classname$::SharedDtor() {\n",
1332
+ "classname", classname_);
1333
+ printer->Indent();
1334
+ // Write the destructors for each field except oneof members.
1335
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1336
+ if (!descriptor_->field(i)->containing_oneof()) {
1337
+ field_generators_.get(descriptor_->field(i))
1338
+ .GenerateDestructorCode(printer);
1339
+ }
1340
+ }
1341
+
1342
+ // Generate code to destruct oneofs. Clearing should do the work.
1343
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
1344
+ printer->Print(
1345
+ "if (has_$oneof_name$()) {\n"
1346
+ " clear_$oneof_name$();\n"
1347
+ "}\n",
1348
+ "oneof_name", descriptor_->oneof_decl(i)->name());
1349
+ }
1350
+
1351
+ PrintHandlingOptionalStaticInitializers(
1352
+ descriptor_->file(), printer,
1353
+ // With static initializers.
1354
+ "if (this != default_instance_) {\n",
1355
+ // Without.
1356
+ "if (this != &default_instance()) {\n");
1357
+
1358
+ // We need to delete all embedded messages.
1359
+ // TODO(kenton): If we make unset messages point at default instances
1360
+ // instead of NULL, then it would make sense to move this code into
1361
+ // MessageFieldGenerator::GenerateDestructorCode().
1362
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1363
+ const FieldDescriptor* field = descriptor_->field(i);
1364
+
1365
+ if (!field->is_repeated() &&
1366
+ field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
1367
+ // Skip oneof members
1368
+ if (!field->containing_oneof()) {
1369
+ printer->Print(
1370
+ " delete $name$_;\n",
1371
+ "name", FieldName(field));
1372
+ }
1373
+ }
1374
+ }
1375
+
1376
+ printer->Outdent();
1377
+ printer->Print(
1378
+ " }\n"
1379
+ "}\n"
1380
+ "\n");
1381
+ }
1382
+
1383
+ void MessageGenerator::
1384
+ GenerateStructors(io::Printer* printer) {
1385
+ string superclass = SuperClassName(descriptor_);
1386
+
1387
+ // Generate the default constructor.
1388
+ printer->Print(
1389
+ "$classname$::$classname$()\n"
1390
+ " : $superclass$() {\n"
1391
+ " SharedCtor();\n"
1392
+ " // @@protoc_insertion_point(constructor:$full_name$)\n"
1393
+ "}\n",
1394
+ "classname", classname_,
1395
+ "superclass", superclass,
1396
+ "full_name", descriptor_->full_name());
1397
+
1398
+ printer->Print(
1399
+ "\n"
1400
+ "void $classname$::InitAsDefaultInstance() {\n",
1401
+ "classname", classname_);
1402
+
1403
+ // The default instance needs all of its embedded message pointers
1404
+ // cross-linked to other default instances. We can't do this initialization
1405
+ // in the constructor because some other default instances may not have been
1406
+ // constructed yet at that time.
1407
+ // TODO(kenton): Maybe all message fields (even for non-default messages)
1408
+ // should be initialized to point at default instances rather than NULL?
1409
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1410
+ const FieldDescriptor* field = descriptor_->field(i);
1411
+
1412
+ if (!field->is_repeated() &&
1413
+ field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
1414
+ (field->containing_oneof() == NULL ||
1415
+ HasDescriptorMethods(descriptor_->file()))) {
1416
+ string name;
1417
+ if (field->containing_oneof()) {
1418
+ name = classname_ + "_default_oneof_instance_->";
1419
+ }
1420
+ name += FieldName(field);
1421
+ PrintHandlingOptionalStaticInitializers(
1422
+ descriptor_->file(), printer,
1423
+ // With static initializers.
1424
+ " $name$_ = const_cast< $type$*>(&$type$::default_instance());\n",
1425
+ // Without.
1426
+ " $name$_ = const_cast< $type$*>(\n"
1427
+ " $type$::internal_default_instance());\n",
1428
+ // Vars.
1429
+ "name", name,
1430
+ "type", FieldMessageTypeName(field));
1431
+ } else if (field->containing_oneof() &&
1432
+ HasDescriptorMethods(descriptor_->file())) {
1433
+ field_generators_.get(descriptor_->field(i))
1434
+ .GenerateConstructorCode(printer);
1435
+ }
1436
+ }
1437
+ printer->Print(
1438
+ "}\n"
1439
+ "\n");
1440
+
1441
+ // Generate the copy constructor.
1442
+ printer->Print(
1443
+ "$classname$::$classname$(const $classname$& from)\n"
1444
+ " : $superclass$() {\n"
1445
+ " SharedCtor();\n"
1446
+ " MergeFrom(from);\n"
1447
+ " // @@protoc_insertion_point(copy_constructor:$full_name$)\n"
1448
+ "}\n"
1449
+ "\n",
1450
+ "classname", classname_,
1451
+ "superclass", superclass,
1452
+ "full_name", descriptor_->full_name());
1453
+
1454
+ // Generate the shared constructor code.
1455
+ GenerateSharedConstructorCode(printer);
1456
+
1457
+ // Generate the destructor.
1458
+ printer->Print(
1459
+ "$classname$::~$classname$() {\n"
1460
+ " // @@protoc_insertion_point(destructor:$full_name$)\n"
1461
+ " SharedDtor();\n"
1462
+ "}\n"
1463
+ "\n",
1464
+ "classname", classname_,
1465
+ "full_name", descriptor_->full_name());
1466
+
1467
+ // Generate the shared destructor code.
1468
+ GenerateSharedDestructorCode(printer);
1469
+
1470
+ // Generate SetCachedSize.
1471
+ printer->Print(
1472
+ "void $classname$::SetCachedSize(int size) const {\n"
1473
+ " GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
1474
+ " _cached_size_ = size;\n"
1475
+ " GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
1476
+ "}\n",
1477
+ "classname", classname_);
1478
+
1479
+ // Only generate this member if it's not disabled.
1480
+ if (HasDescriptorMethods(descriptor_->file()) &&
1481
+ !descriptor_->options().no_standard_descriptor_accessor()) {
1482
+ printer->Print(
1483
+ "const ::google::protobuf::Descriptor* $classname$::descriptor() {\n"
1484
+ " protobuf_AssignDescriptorsOnce();\n"
1485
+ " return $classname$_descriptor_;\n"
1486
+ "}\n"
1487
+ "\n",
1488
+ "classname", classname_,
1489
+ "adddescriptorsname",
1490
+ GlobalAddDescriptorsName(descriptor_->file()->name()));
1491
+ }
1492
+
1493
+ printer->Print(
1494
+ "const $classname$& $classname$::default_instance() {\n",
1495
+ "classname", classname_);
1496
+
1497
+ PrintHandlingOptionalStaticInitializers(
1498
+ descriptor_->file(), printer,
1499
+ // With static initializers.
1500
+ " if (default_instance_ == NULL) $adddescriptorsname$();\n",
1501
+ // Without.
1502
+ " $adddescriptorsname$();\n",
1503
+ // Vars.
1504
+ "adddescriptorsname",
1505
+ GlobalAddDescriptorsName(descriptor_->file()->name()));
1506
+
1507
+ printer->Print(
1508
+ " return *default_instance_;\n"
1509
+ "}\n"
1510
+ "\n"
1511
+ "$classname$* $classname$::default_instance_ = NULL;\n"
1512
+ "\n",
1513
+ "classname", classname_);
1514
+
1515
+ printer->Print(
1516
+ "$classname$* $classname$::New() const {\n"
1517
+ " return new $classname$;\n"
1518
+ "}\n",
1519
+ "classname", classname_);
1520
+
1521
+ }
1522
+
1523
+ // Return the number of bits set in n, a non-negative integer.
1524
+ static int popcnt(uint32 n) {
1525
+ int result = 0;
1526
+ while (n != 0) {
1527
+ result += (n & 1);
1528
+ n = n / 2;
1529
+ }
1530
+ return result;
1531
+ }
1532
+
1533
+ void MessageGenerator::
1534
+ GenerateClear(io::Printer* printer) {
1535
+ printer->Print("void $classname$::Clear() {\n",
1536
+ "classname", classname_);
1537
+ printer->Indent();
1538
+
1539
+ // Step 1: Extensions
1540
+ if (descriptor_->extension_range_count() > 0) {
1541
+ printer->Print("_extensions_.Clear();\n");
1542
+ }
1543
+
1544
+ // Step 2: Everything but extensions, repeateds, unions.
1545
+ // These are handled in chunks of 8. The first chunk is
1546
+ // the non-extensions-non-repeateds-non-unions in
1547
+ // descriptor_->field(0), descriptor_->field(1), ... descriptor_->field(7),
1548
+ // and the second chunk is the same for
1549
+ // descriptor_->field(8), descriptor_->field(9), ... descriptor_->field(15),
1550
+ // etc.
1551
+ set<int> step2_indices;
1552
+ hash_map<string, int> fieldname_to_chunk;
1553
+ hash_map<int, string> memsets_for_chunk;
1554
+ hash_map<int, int> memset_field_count_for_chunk;
1555
+ hash_set<string> handled; // fields that appear anywhere in memsets_for_chunk
1556
+ hash_map<int, uint32> fields_mask_for_chunk;
1557
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1558
+ const FieldDescriptor* field = descriptor_->field(i);
1559
+ if (!field->is_repeated() && !field->containing_oneof()) {
1560
+ step2_indices.insert(i);
1561
+ int chunk = i / 8;
1562
+ fieldname_to_chunk[FieldName(field)] = chunk;
1563
+ fields_mask_for_chunk[chunk] |= static_cast<uint32>(1) << (i % 32);
1564
+ }
1565
+ }
1566
+
1567
+ // Step 2a: Greedily seek runs of fields that can be cleared by memset-to-0.
1568
+ // The generated code uses two macros to help it clear runs of fields:
1569
+ // OFFSET_OF_FIELD_ computes the offset (in bytes) of a field in the Message.
1570
+ // ZR_ zeroes a non-empty range of fields via memset.
1571
+ const char* macros =
1572
+ "#define OFFSET_OF_FIELD_(f) (reinterpret_cast<char*>( \\\n"
1573
+ " &reinterpret_cast<$classname$*>(16)->f) - \\\n"
1574
+ " reinterpret_cast<char*>(16))\n\n"
1575
+ "#define ZR_(first, last) do { \\\n"
1576
+ " size_t f = OFFSET_OF_FIELD_(first); \\\n"
1577
+ " size_t n = OFFSET_OF_FIELD_(last) - f + sizeof(last); \\\n"
1578
+ " ::memset(&first, 0, n); \\\n"
1579
+ " } while (0)\n\n";
1580
+ for (int i = 0; i < runs_of_fields_.size(); i++) {
1581
+ const vector<string>& run = runs_of_fields_[i];
1582
+ if (run.size() < 2) continue;
1583
+ const string& first_field_name = run[0];
1584
+ const string& last_field_name = run.back();
1585
+ int chunk = fieldname_to_chunk[run[0]];
1586
+ memsets_for_chunk[chunk].append(
1587
+ "ZR_(" + first_field_name + "_, " + last_field_name + "_);\n");
1588
+ for (int j = 0; j < run.size(); j++) {
1589
+ GOOGLE_DCHECK_EQ(chunk, fieldname_to_chunk[run[j]]);
1590
+ handled.insert(run[j]);
1591
+ }
1592
+ memset_field_count_for_chunk[chunk] += run.size();
1593
+ }
1594
+ const bool macros_are_needed = handled.size() > 0;
1595
+ if (macros_are_needed) {
1596
+ printer->Outdent();
1597
+ printer->Print(macros,
1598
+ "classname", classname_);
1599
+ printer->Indent();
1600
+ }
1601
+ // Step 2b: Finish step 2, ignoring fields handled in step 2a.
1602
+ int last_index = -1;
1603
+ bool chunk_block_in_progress = false;
1604
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1605
+ if (step2_indices.count(i) == 0) continue;
1606
+ const FieldDescriptor* field = descriptor_->field(i);
1607
+ const string fieldname = FieldName(field);
1608
+ if (i / 8 != last_index / 8 || last_index < 0) {
1609
+ // End previous chunk, if there was one.
1610
+ if (chunk_block_in_progress) {
1611
+ printer->Outdent();
1612
+ printer->Print("}\n");
1613
+ chunk_block_in_progress = false;
1614
+ }
1615
+ // Start chunk.
1616
+ const string& memsets = memsets_for_chunk[i / 8];
1617
+ uint32 mask = fields_mask_for_chunk[i / 8];
1618
+ int count = popcnt(mask);
1619
+ if (count == 1 ||
1620
+ (count <= 4 && count == memset_field_count_for_chunk[i / 8])) {
1621
+ // No "if" here because the chunk is trivial.
1622
+ } else {
1623
+ printer->Print(
1624
+ "if (_has_bits_[$index$ / 32] & $mask$) {\n",
1625
+ "index", SimpleItoa(i / 8 * 8),
1626
+ "mask", SimpleItoa(mask));
1627
+ printer->Indent();
1628
+ chunk_block_in_progress = true;
1629
+ }
1630
+ printer->Print(memsets.c_str());
1631
+ }
1632
+ last_index = i;
1633
+ if (handled.count(fieldname) > 0) continue;
1634
+
1635
+ // It's faster to just overwrite primitive types, but we should
1636
+ // only clear strings and messages if they were set.
1637
+ // TODO(kenton): Let the CppFieldGenerator decide this somehow.
1638
+ bool should_check_bit =
1639
+ field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE ||
1640
+ field->cpp_type() == FieldDescriptor::CPPTYPE_STRING;
1641
+
1642
+ if (should_check_bit) {
1643
+ printer->Print("if (has_$name$()) {\n", "name", fieldname);
1644
+ printer->Indent();
1645
+ }
1646
+
1647
+ field_generators_.get(field).GenerateClearingCode(printer);
1648
+
1649
+ if (should_check_bit) {
1650
+ printer->Outdent();
1651
+ printer->Print("}\n");
1652
+ }
1653
+ }
1654
+
1655
+ if (chunk_block_in_progress) {
1656
+ printer->Outdent();
1657
+ printer->Print("}\n");
1658
+ }
1659
+ if (macros_are_needed) {
1660
+ printer->Outdent();
1661
+ printer->Print("\n#undef OFFSET_OF_FIELD_\n#undef ZR_\n\n");
1662
+ printer->Indent();
1663
+ }
1664
+
1665
+ // Step 3: Repeated fields don't use _has_bits_; emit code to clear them here.
1666
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1667
+ const FieldDescriptor* field = descriptor_->field(i);
1668
+
1669
+ if (field->is_repeated()) {
1670
+ field_generators_.get(field).GenerateClearingCode(printer);
1671
+ }
1672
+ }
1673
+
1674
+ // Step 4: Unions.
1675
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
1676
+ printer->Print(
1677
+ "clear_$oneof_name$();\n",
1678
+ "oneof_name", descriptor_->oneof_decl(i)->name());
1679
+ }
1680
+
1681
+ // Step 5: Everything else.
1682
+ printer->Print(
1683
+ "::memset(_has_bits_, 0, sizeof(_has_bits_));\n");
1684
+
1685
+ if (UseUnknownFieldSet(descriptor_->file())) {
1686
+ printer->Print(
1687
+ "mutable_unknown_fields()->Clear();\n");
1688
+ } else {
1689
+ printer->Print(
1690
+ "mutable_unknown_fields()->clear();\n");
1691
+ }
1692
+
1693
+ printer->Outdent();
1694
+ printer->Print("}\n");
1695
+ }
1696
+
1697
+ void MessageGenerator::
1698
+ GenerateOneofClear(io::Printer* printer) {
1699
+ // Generated function clears the active field and union case (e.g. foo_case_).
1700
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
1701
+ printer->Print(
1702
+ "void $classname$::clear_$oneofname$() {\n",
1703
+ "classname", classname_,
1704
+ "oneofname", descriptor_->oneof_decl(i)->name());
1705
+ printer->Indent();
1706
+ printer->Print(
1707
+ "switch($oneofname$_case()) {\n",
1708
+ "oneofname", descriptor_->oneof_decl(i)->name());
1709
+ printer->Indent();
1710
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
1711
+ const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
1712
+ printer->Print(
1713
+ "case k$field_name$: {\n",
1714
+ "field_name", UnderscoresToCamelCase(field->name(), true));
1715
+ printer->Indent();
1716
+ // We clear only allocated objects in oneofs
1717
+ if (!IsStringOrMessage(field)) {
1718
+ printer->Print(
1719
+ "// No need to clear\n");
1720
+ } else {
1721
+ field_generators_.get(field).GenerateClearingCode(printer);
1722
+ }
1723
+ printer->Print(
1724
+ "break;\n");
1725
+ printer->Outdent();
1726
+ printer->Print(
1727
+ "}\n");
1728
+ }
1729
+ printer->Print(
1730
+ "case $cap_oneof_name$_NOT_SET: {\n"
1731
+ " break;\n"
1732
+ "}\n",
1733
+ "cap_oneof_name",
1734
+ ToUpper(descriptor_->oneof_decl(i)->name()));
1735
+ printer->Outdent();
1736
+ printer->Print(
1737
+ "}\n"
1738
+ "_oneof_case_[$oneof_index$] = $cap_oneof_name$_NOT_SET;\n",
1739
+ "oneof_index", SimpleItoa(i),
1740
+ "cap_oneof_name",
1741
+ ToUpper(descriptor_->oneof_decl(i)->name()));
1742
+ printer->Outdent();
1743
+ printer->Print(
1744
+ "}\n"
1745
+ "\n");
1746
+ }
1747
+ }
1748
+
1749
+ void MessageGenerator::
1750
+ GenerateSwap(io::Printer* printer) {
1751
+ // Generate the Swap member function.
1752
+ printer->Print("void $classname$::Swap($classname$* other) {\n",
1753
+ "classname", classname_);
1754
+ printer->Indent();
1755
+ printer->Print("if (other != this) {\n");
1756
+ printer->Indent();
1757
+
1758
+ if (HasGeneratedMethods(descriptor_->file())) {
1759
+ for (int i = 0; i < descriptor_->field_count(); i++) {
1760
+ const FieldDescriptor* field = descriptor_->field(i);
1761
+ field_generators_.get(field).GenerateSwappingCode(printer);
1762
+ }
1763
+
1764
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
1765
+ printer->Print(
1766
+ "std::swap($oneof_name$_, other->$oneof_name$_);\n"
1767
+ "std::swap(_oneof_case_[$i$], other->_oneof_case_[$i$]);\n",
1768
+ "oneof_name", descriptor_->oneof_decl(i)->name(),
1769
+ "i", SimpleItoa(i));
1770
+ }
1771
+
1772
+ for (int i = 0; i < (descriptor_->field_count() + 31) / 32; ++i) {
1773
+ printer->Print("std::swap(_has_bits_[$i$], other->_has_bits_[$i$]);\n",
1774
+ "i", SimpleItoa(i));
1775
+ }
1776
+
1777
+ if (UseUnknownFieldSet(descriptor_->file())) {
1778
+ printer->Print("_unknown_fields_.Swap(&other->_unknown_fields_);\n");
1779
+ } else {
1780
+ printer->Print("_unknown_fields_.swap(other->_unknown_fields_);\n");
1781
+ }
1782
+ printer->Print("std::swap(_cached_size_, other->_cached_size_);\n");
1783
+ if (descriptor_->extension_range_count() > 0) {
1784
+ printer->Print("_extensions_.Swap(&other->_extensions_);\n");
1785
+ }
1786
+ } else {
1787
+ printer->Print("GetReflection()->Swap(this, other);");
1788
+ }
1789
+
1790
+ printer->Outdent();
1791
+ printer->Print("}\n");
1792
+ printer->Outdent();
1793
+ printer->Print("}\n");
1794
+ }
1795
+
1796
+ void MessageGenerator::
1797
+ GenerateMergeFrom(io::Printer* printer) {
1798
+ if (HasDescriptorMethods(descriptor_->file())) {
1799
+ // Generate the generalized MergeFrom (aka that which takes in the Message
1800
+ // base class as a parameter).
1801
+ printer->Print(
1802
+ "void $classname$::MergeFrom(const ::google::protobuf::Message& from) {\n"
1803
+ " GOOGLE_CHECK_NE(&from, this);\n",
1804
+ "classname", classname_);
1805
+ printer->Indent();
1806
+
1807
+ // Cast the message to the proper type. If we find that the message is
1808
+ // *not* of the proper type, we can still call Merge via the reflection
1809
+ // system, as the GOOGLE_CHECK above ensured that we have the same descriptor
1810
+ // for each message.
1811
+ printer->Print(
1812
+ "const $classname$* source =\n"
1813
+ " ::google::protobuf::internal::dynamic_cast_if_available<const $classname$*>(\n"
1814
+ " &from);\n"
1815
+ "if (source == NULL) {\n"
1816
+ " ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n"
1817
+ "} else {\n"
1818
+ " MergeFrom(*source);\n"
1819
+ "}\n",
1820
+ "classname", classname_);
1821
+
1822
+ printer->Outdent();
1823
+ printer->Print("}\n\n");
1824
+ } else {
1825
+ // Generate CheckTypeAndMergeFrom().
1826
+ printer->Print(
1827
+ "void $classname$::CheckTypeAndMergeFrom(\n"
1828
+ " const ::google::protobuf::MessageLite& from) {\n"
1829
+ " MergeFrom(*::google::protobuf::down_cast<const $classname$*>(&from));\n"
1830
+ "}\n"
1831
+ "\n",
1832
+ "classname", classname_);
1833
+ }
1834
+
1835
+ // Generate the class-specific MergeFrom, which avoids the GOOGLE_CHECK and cast.
1836
+ printer->Print(
1837
+ "void $classname$::MergeFrom(const $classname$& from) {\n"
1838
+ " GOOGLE_CHECK_NE(&from, this);\n",
1839
+ "classname", classname_);
1840
+ printer->Indent();
1841
+
1842
+ // Merge Repeated fields. These fields do not require a
1843
+ // check as we can simply iterate over them.
1844
+ for (int i = 0; i < descriptor_->field_count(); ++i) {
1845
+ const FieldDescriptor* field = descriptor_->field(i);
1846
+
1847
+ if (field->is_repeated()) {
1848
+ field_generators_.get(field).GenerateMergingCode(printer);
1849
+ }
1850
+ }
1851
+
1852
+ // Merge oneof fields. Oneof field requires oneof case check.
1853
+ for (int i = 0; i < descriptor_->oneof_decl_count(); ++i) {
1854
+ printer->Print(
1855
+ "switch (from.$oneofname$_case()) {\n",
1856
+ "oneofname", descriptor_->oneof_decl(i)->name());
1857
+ printer->Indent();
1858
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
1859
+ const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
1860
+ printer->Print(
1861
+ "case k$field_name$: {\n",
1862
+ "field_name", UnderscoresToCamelCase(field->name(), true));
1863
+ printer->Indent();
1864
+ field_generators_.get(field).GenerateMergingCode(printer);
1865
+ printer->Print(
1866
+ "break;\n");
1867
+ printer->Outdent();
1868
+ printer->Print(
1869
+ "}\n");
1870
+ }
1871
+ printer->Print(
1872
+ "case $cap_oneof_name$_NOT_SET: {\n"
1873
+ " break;\n"
1874
+ "}\n",
1875
+ "cap_oneof_name",
1876
+ ToUpper(descriptor_->oneof_decl(i)->name()));
1877
+ printer->Outdent();
1878
+ printer->Print(
1879
+ "}\n");
1880
+ }
1881
+
1882
+ // Merge Optional and Required fields (after a _has_bit check).
1883
+ int last_index = -1;
1884
+
1885
+ for (int i = 0; i < descriptor_->field_count(); ++i) {
1886
+ const FieldDescriptor* field = descriptor_->field(i);
1887
+
1888
+ if (!field->is_repeated() && !field->containing_oneof()) {
1889
+ // See above in GenerateClear for an explanation of this.
1890
+ if (i / 8 != last_index / 8 || last_index < 0) {
1891
+ if (last_index >= 0) {
1892
+ printer->Outdent();
1893
+ printer->Print("}\n");
1894
+ }
1895
+ printer->Print(
1896
+ "if (from._has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\n",
1897
+ "index", SimpleItoa(field->index()));
1898
+ printer->Indent();
1899
+ }
1900
+
1901
+ last_index = i;
1902
+
1903
+ printer->Print(
1904
+ "if (from.has_$name$()) {\n",
1905
+ "name", FieldName(field));
1906
+ printer->Indent();
1907
+
1908
+ field_generators_.get(field).GenerateMergingCode(printer);
1909
+
1910
+ printer->Outdent();
1911
+ printer->Print("}\n");
1912
+ }
1913
+ }
1914
+
1915
+ if (last_index >= 0) {
1916
+ printer->Outdent();
1917
+ printer->Print("}\n");
1918
+ }
1919
+
1920
+ if (descriptor_->extension_range_count() > 0) {
1921
+ printer->Print("_extensions_.MergeFrom(from._extensions_);\n");
1922
+ }
1923
+
1924
+ if (UseUnknownFieldSet(descriptor_->file())) {
1925
+ printer->Print(
1926
+ "mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n");
1927
+ } else {
1928
+ printer->Print(
1929
+ "mutable_unknown_fields()->append(from.unknown_fields());\n");
1930
+ }
1931
+
1932
+ printer->Outdent();
1933
+ printer->Print("}\n");
1934
+ }
1935
+
1936
+ void MessageGenerator::
1937
+ GenerateCopyFrom(io::Printer* printer) {
1938
+ if (HasDescriptorMethods(descriptor_->file())) {
1939
+ // Generate the generalized CopyFrom (aka that which takes in the Message
1940
+ // base class as a parameter).
1941
+ printer->Print(
1942
+ "void $classname$::CopyFrom(const ::google::protobuf::Message& from) {\n",
1943
+ "classname", classname_);
1944
+ printer->Indent();
1945
+
1946
+ printer->Print(
1947
+ "if (&from == this) return;\n"
1948
+ "Clear();\n"
1949
+ "MergeFrom(from);\n");
1950
+
1951
+ printer->Outdent();
1952
+ printer->Print("}\n\n");
1953
+ }
1954
+
1955
+ // Generate the class-specific CopyFrom.
1956
+ printer->Print(
1957
+ "void $classname$::CopyFrom(const $classname$& from) {\n",
1958
+ "classname", classname_);
1959
+ printer->Indent();
1960
+
1961
+ printer->Print(
1962
+ "if (&from == this) return;\n"
1963
+ "Clear();\n"
1964
+ "MergeFrom(from);\n");
1965
+
1966
+ printer->Outdent();
1967
+ printer->Print("}\n");
1968
+ }
1969
+
1970
+ void MessageGenerator::
1971
+ GenerateMergeFromCodedStream(io::Printer* printer) {
1972
+ if (descriptor_->options().message_set_wire_format()) {
1973
+ // Special-case MessageSet.
1974
+ printer->Print(
1975
+ "bool $classname$::MergePartialFromCodedStream(\n"
1976
+ " ::google::protobuf::io::CodedInputStream* input) {\n",
1977
+ "classname", classname_);
1978
+
1979
+ PrintHandlingOptionalStaticInitializers(
1980
+ descriptor_->file(), printer,
1981
+ // With static initializers.
1982
+ " return _extensions_.ParseMessageSet(input, default_instance_,\n"
1983
+ " mutable_unknown_fields());\n",
1984
+ // Without.
1985
+ " return _extensions_.ParseMessageSet(input, &default_instance(),\n"
1986
+ " mutable_unknown_fields());\n",
1987
+ // Vars.
1988
+ "classname", classname_);
1989
+
1990
+ printer->Print(
1991
+ "}\n");
1992
+ return;
1993
+ }
1994
+
1995
+ printer->Print(
1996
+ "bool $classname$::MergePartialFromCodedStream(\n"
1997
+ " ::google::protobuf::io::CodedInputStream* input) {\n"
1998
+ "#define DO_(EXPRESSION) if (!(EXPRESSION)) goto failure\n"
1999
+ " ::google::protobuf::uint32 tag;\n",
2000
+ "classname", classname_);
2001
+
2002
+ if (!UseUnknownFieldSet(descriptor_->file())) {
2003
+ printer->Print(
2004
+ " ::google::protobuf::io::StringOutputStream unknown_fields_string(\n"
2005
+ " mutable_unknown_fields());\n"
2006
+ " ::google::protobuf::io::CodedOutputStream unknown_fields_stream(\n"
2007
+ " &unknown_fields_string);\n");
2008
+ }
2009
+
2010
+ printer->Print(
2011
+ " // @@protoc_insertion_point(parse_start:$full_name$)\n",
2012
+ "full_name", descriptor_->full_name());
2013
+
2014
+ printer->Indent();
2015
+ printer->Print("for (;;) {\n");
2016
+ printer->Indent();
2017
+
2018
+ scoped_array<const FieldDescriptor*> ordered_fields(
2019
+ SortFieldsByNumber(descriptor_));
2020
+ uint32 maxtag = descriptor_->field_count() == 0 ? 0 :
2021
+ WireFormat::MakeTag(ordered_fields[descriptor_->field_count() - 1]);
2022
+ const int kCutoff0 = 127; // fits in 1-byte varint
2023
+ const int kCutoff1 = (127 << 7) + 127; // fits in 2-byte varint
2024
+ printer->Print("::std::pair< ::google::protobuf::uint32, bool> p = "
2025
+ "input->ReadTagWithCutoff($max$);\n"
2026
+ "tag = p.first;\n"
2027
+ "if (!p.second) goto handle_unusual;\n",
2028
+ "max", SimpleItoa(maxtag <= kCutoff0 ? kCutoff0 :
2029
+ (maxtag <= kCutoff1 ? kCutoff1 :
2030
+ maxtag)));
2031
+ if (descriptor_->field_count() > 0) {
2032
+ // We don't even want to print the switch() if we have no fields because
2033
+ // MSVC dislikes switch() statements that contain only a default value.
2034
+
2035
+ // Note: If we just switched on the tag rather than the field number, we
2036
+ // could avoid the need for the if() to check the wire type at the beginning
2037
+ // of each case. However, this is actually a bit slower in practice as it
2038
+ // creates a jump table that is 8x larger and sparser, and meanwhile the
2039
+ // if()s are highly predictable.
2040
+ printer->Print("switch (::google::protobuf::internal::WireFormatLite::"
2041
+ "GetTagFieldNumber(tag)) {\n");
2042
+
2043
+ printer->Indent();
2044
+
2045
+ for (int i = 0; i < descriptor_->field_count(); i++) {
2046
+ const FieldDescriptor* field = ordered_fields[i];
2047
+
2048
+ PrintFieldComment(printer, field);
2049
+
2050
+ printer->Print(
2051
+ "case $number$: {\n",
2052
+ "number", SimpleItoa(field->number()));
2053
+ printer->Indent();
2054
+ const FieldGenerator& field_generator = field_generators_.get(field);
2055
+
2056
+ // Emit code to parse the common, expected case.
2057
+ printer->Print("if (tag == $commontag$) {\n",
2058
+ "commontag", SimpleItoa(WireFormat::MakeTag(field)));
2059
+
2060
+ if (i > 0 || (field->is_repeated() && !field->options().packed())) {
2061
+ printer->Print(
2062
+ " parse_$name$:\n",
2063
+ "name", field->name());
2064
+ }
2065
+
2066
+ printer->Indent();
2067
+ if (field->options().packed()) {
2068
+ field_generator.GenerateMergeFromCodedStreamWithPacking(printer);
2069
+ } else {
2070
+ field_generator.GenerateMergeFromCodedStream(printer);
2071
+ }
2072
+ printer->Outdent();
2073
+
2074
+ // Emit code to parse unexpectedly packed or unpacked values.
2075
+ if (field->is_packable() && field->options().packed()) {
2076
+ internal::WireFormatLite::WireType wiretype =
2077
+ WireFormat::WireTypeForFieldType(field->type());
2078
+ printer->Print("} else if (tag == $uncommontag$) {\n",
2079
+ "uncommontag", SimpleItoa(
2080
+ internal::WireFormatLite::MakeTag(
2081
+ field->number(), wiretype)));
2082
+ printer->Indent();
2083
+ field_generator.GenerateMergeFromCodedStream(printer);
2084
+ printer->Outdent();
2085
+ } else if (field->is_packable() && !field->options().packed()) {
2086
+ internal::WireFormatLite::WireType wiretype =
2087
+ internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED;
2088
+ printer->Print("} else if (tag == $uncommontag$) {\n",
2089
+ "uncommontag", SimpleItoa(
2090
+ internal::WireFormatLite::MakeTag(
2091
+ field->number(), wiretype)));
2092
+ printer->Indent();
2093
+ field_generator.GenerateMergeFromCodedStreamWithPacking(printer);
2094
+ printer->Outdent();
2095
+ }
2096
+
2097
+ printer->Print(
2098
+ "} else {\n"
2099
+ " goto handle_unusual;\n"
2100
+ "}\n");
2101
+
2102
+ // switch() is slow since it can't be predicted well. Insert some if()s
2103
+ // here that attempt to predict the next tag.
2104
+ if (field->is_repeated() && !field->options().packed()) {
2105
+ // Expect repeats of this field.
2106
+ printer->Print(
2107
+ "if (input->ExpectTag($tag$)) goto parse_$name$;\n",
2108
+ "tag", SimpleItoa(WireFormat::MakeTag(field)),
2109
+ "name", field->name());
2110
+ }
2111
+
2112
+ if (i + 1 < descriptor_->field_count()) {
2113
+ // Expect the next field in order.
2114
+ const FieldDescriptor* next_field = ordered_fields[i + 1];
2115
+ printer->Print(
2116
+ "if (input->ExpectTag($next_tag$)) goto parse_$next_name$;\n",
2117
+ "next_tag", SimpleItoa(WireFormat::MakeTag(next_field)),
2118
+ "next_name", next_field->name());
2119
+ } else {
2120
+ // Expect EOF.
2121
+ // TODO(kenton): Expect group end-tag?
2122
+ printer->Print(
2123
+ "if (input->ExpectAtEnd()) goto success;\n");
2124
+ }
2125
+
2126
+ printer->Print(
2127
+ "break;\n");
2128
+
2129
+ printer->Outdent();
2130
+ printer->Print("}\n\n");
2131
+ }
2132
+
2133
+ printer->Print("default: {\n");
2134
+ printer->Indent();
2135
+ }
2136
+
2137
+ printer->Outdent();
2138
+ printer->Print("handle_unusual:\n");
2139
+ printer->Indent();
2140
+ // If tag is 0 or an end-group tag then this must be the end of the message.
2141
+ printer->Print(
2142
+ "if (tag == 0 ||\n"
2143
+ " ::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n"
2144
+ " ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n"
2145
+ " goto success;\n"
2146
+ "}\n");
2147
+
2148
+ // Handle extension ranges.
2149
+ if (descriptor_->extension_range_count() > 0) {
2150
+ printer->Print(
2151
+ "if (");
2152
+ for (int i = 0; i < descriptor_->extension_range_count(); i++) {
2153
+ const Descriptor::ExtensionRange* range =
2154
+ descriptor_->extension_range(i);
2155
+ if (i > 0) printer->Print(" ||\n ");
2156
+
2157
+ uint32 start_tag = WireFormatLite::MakeTag(
2158
+ range->start, static_cast<WireFormatLite::WireType>(0));
2159
+ uint32 end_tag = WireFormatLite::MakeTag(
2160
+ range->end, static_cast<WireFormatLite::WireType>(0));
2161
+
2162
+ if (range->end > FieldDescriptor::kMaxNumber) {
2163
+ printer->Print(
2164
+ "($start$u <= tag)",
2165
+ "start", SimpleItoa(start_tag));
2166
+ } else {
2167
+ printer->Print(
2168
+ "($start$u <= tag && tag < $end$u)",
2169
+ "start", SimpleItoa(start_tag),
2170
+ "end", SimpleItoa(end_tag));
2171
+ }
2172
+ }
2173
+ printer->Print(") {\n");
2174
+ if (UseUnknownFieldSet(descriptor_->file())) {
2175
+ PrintHandlingOptionalStaticInitializers(
2176
+ descriptor_->file(), printer,
2177
+ // With static initializers.
2178
+ " DO_(_extensions_.ParseField(tag, input, default_instance_,\n"
2179
+ " mutable_unknown_fields()));\n",
2180
+ // Without.
2181
+ " DO_(_extensions_.ParseField(tag, input, &default_instance(),\n"
2182
+ " mutable_unknown_fields()));\n");
2183
+ } else {
2184
+ PrintHandlingOptionalStaticInitializers(
2185
+ descriptor_->file(), printer,
2186
+ // With static initializers.
2187
+ " DO_(_extensions_.ParseField(tag, input, default_instance_,\n"
2188
+ " &unknown_fields_stream));\n",
2189
+ // Without.
2190
+ " DO_(_extensions_.ParseField(tag, input, &default_instance(),\n"
2191
+ " &unknown_fields_stream));\n");
2192
+ }
2193
+ printer->Print(
2194
+ " continue;\n"
2195
+ "}\n");
2196
+ }
2197
+
2198
+ // We really don't recognize this tag. Skip it.
2199
+ if (UseUnknownFieldSet(descriptor_->file())) {
2200
+ printer->Print(
2201
+ "DO_(::google::protobuf::internal::WireFormat::SkipField(\n"
2202
+ " input, tag, mutable_unknown_fields()));\n");
2203
+ } else {
2204
+ printer->Print(
2205
+ "DO_(::google::protobuf::internal::WireFormatLite::SkipField(\n"
2206
+ " input, tag, &unknown_fields_stream));\n");
2207
+ }
2208
+
2209
+ if (descriptor_->field_count() > 0) {
2210
+ printer->Print("break;\n");
2211
+ printer->Outdent();
2212
+ printer->Print("}\n"); // default:
2213
+ printer->Outdent();
2214
+ printer->Print("}\n"); // switch
2215
+ }
2216
+
2217
+ printer->Outdent();
2218
+ printer->Outdent();
2219
+ printer->Print(
2220
+ " }\n" // for (;;)
2221
+ "success:\n"
2222
+ " // @@protoc_insertion_point(parse_success:$full_name$)\n"
2223
+ " return true;\n"
2224
+ "failure:\n"
2225
+ " // @@protoc_insertion_point(parse_failure:$full_name$)\n"
2226
+ " return false;\n"
2227
+ "#undef DO_\n"
2228
+ "}\n", "full_name", descriptor_->full_name());
2229
+ }
2230
+
2231
+ void MessageGenerator::GenerateSerializeOneField(
2232
+ io::Printer* printer, const FieldDescriptor* field, bool to_array) {
2233
+ PrintFieldComment(printer, field);
2234
+
2235
+ if (!field->is_repeated()) {
2236
+ printer->Print(
2237
+ "if (has_$name$()) {\n",
2238
+ "name", FieldName(field));
2239
+ printer->Indent();
2240
+ }
2241
+
2242
+ if (to_array) {
2243
+ field_generators_.get(field).GenerateSerializeWithCachedSizesToArray(
2244
+ printer);
2245
+ } else {
2246
+ field_generators_.get(field).GenerateSerializeWithCachedSizes(printer);
2247
+ }
2248
+
2249
+ if (!field->is_repeated()) {
2250
+ printer->Outdent();
2251
+ printer->Print("}\n");
2252
+ }
2253
+ printer->Print("\n");
2254
+ }
2255
+
2256
+ void MessageGenerator::GenerateSerializeOneExtensionRange(
2257
+ io::Printer* printer, const Descriptor::ExtensionRange* range,
2258
+ bool to_array) {
2259
+ map<string, string> vars;
2260
+ vars["start"] = SimpleItoa(range->start);
2261
+ vars["end"] = SimpleItoa(range->end);
2262
+ printer->Print(vars,
2263
+ "// Extension range [$start$, $end$)\n");
2264
+ if (to_array) {
2265
+ printer->Print(vars,
2266
+ "target = _extensions_.SerializeWithCachedSizesToArray(\n"
2267
+ " $start$, $end$, target);\n\n");
2268
+ } else {
2269
+ printer->Print(vars,
2270
+ "_extensions_.SerializeWithCachedSizes(\n"
2271
+ " $start$, $end$, output);\n\n");
2272
+ }
2273
+ }
2274
+
2275
+ void MessageGenerator::
2276
+ GenerateSerializeWithCachedSizes(io::Printer* printer) {
2277
+ if (descriptor_->options().message_set_wire_format()) {
2278
+ // Special-case MessageSet.
2279
+ printer->Print(
2280
+ "void $classname$::SerializeWithCachedSizes(\n"
2281
+ " ::google::protobuf::io::CodedOutputStream* output) const {\n"
2282
+ " _extensions_.SerializeMessageSetWithCachedSizes(output);\n",
2283
+ "classname", classname_);
2284
+ GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file()));
2285
+ printer->Print(
2286
+ " ::google::protobuf::internal::WireFormat::SerializeUnknownMessageSetItems(\n"
2287
+ " unknown_fields(), output);\n");
2288
+ printer->Print(
2289
+ "}\n");
2290
+ return;
2291
+ }
2292
+
2293
+ printer->Print(
2294
+ "void $classname$::SerializeWithCachedSizes(\n"
2295
+ " ::google::protobuf::io::CodedOutputStream* output) const {\n",
2296
+ "classname", classname_);
2297
+ printer->Indent();
2298
+
2299
+ printer->Print(
2300
+ "// @@protoc_insertion_point(serialize_start:$full_name$)\n",
2301
+ "full_name", descriptor_->full_name());
2302
+
2303
+ GenerateSerializeWithCachedSizesBody(printer, false);
2304
+
2305
+ printer->Print(
2306
+ "// @@protoc_insertion_point(serialize_end:$full_name$)\n",
2307
+ "full_name", descriptor_->full_name());
2308
+
2309
+ printer->Outdent();
2310
+ printer->Print(
2311
+ "}\n");
2312
+ }
2313
+
2314
+ void MessageGenerator::
2315
+ GenerateSerializeWithCachedSizesToArray(io::Printer* printer) {
2316
+ if (descriptor_->options().message_set_wire_format()) {
2317
+ // Special-case MessageSet.
2318
+ printer->Print(
2319
+ "::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\n"
2320
+ " ::google::protobuf::uint8* target) const {\n"
2321
+ " target =\n"
2322
+ " _extensions_.SerializeMessageSetWithCachedSizesToArray(target);\n",
2323
+ "classname", classname_);
2324
+ GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file()));
2325
+ printer->Print(
2326
+ " target = ::google::protobuf::internal::WireFormat::\n"
2327
+ " SerializeUnknownMessageSetItemsToArray(\n"
2328
+ " unknown_fields(), target);\n");
2329
+ printer->Print(
2330
+ " return target;\n"
2331
+ "}\n");
2332
+ return;
2333
+ }
2334
+
2335
+ printer->Print(
2336
+ "::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\n"
2337
+ " ::google::protobuf::uint8* target) const {\n",
2338
+ "classname", classname_);
2339
+ printer->Indent();
2340
+
2341
+ printer->Print(
2342
+ "// @@protoc_insertion_point(serialize_to_array_start:$full_name$)\n",
2343
+ "full_name", descriptor_->full_name());
2344
+
2345
+ GenerateSerializeWithCachedSizesBody(printer, true);
2346
+
2347
+ printer->Print(
2348
+ "// @@protoc_insertion_point(serialize_to_array_end:$full_name$)\n",
2349
+ "full_name", descriptor_->full_name());
2350
+
2351
+ printer->Outdent();
2352
+ printer->Print(
2353
+ " return target;\n"
2354
+ "}\n");
2355
+ }
2356
+
2357
+ void MessageGenerator::
2358
+ GenerateSerializeWithCachedSizesBody(io::Printer* printer, bool to_array) {
2359
+ scoped_array<const FieldDescriptor*> ordered_fields(
2360
+ SortFieldsByNumber(descriptor_));
2361
+
2362
+ vector<const Descriptor::ExtensionRange*> sorted_extensions;
2363
+ for (int i = 0; i < descriptor_->extension_range_count(); ++i) {
2364
+ sorted_extensions.push_back(descriptor_->extension_range(i));
2365
+ }
2366
+ sort(sorted_extensions.begin(), sorted_extensions.end(),
2367
+ ExtensionRangeSorter());
2368
+
2369
+ // Merge the fields and the extension ranges, both sorted by field number.
2370
+ int i, j;
2371
+ for (i = 0, j = 0;
2372
+ i < descriptor_->field_count() || j < sorted_extensions.size();
2373
+ ) {
2374
+ if (i == descriptor_->field_count()) {
2375
+ GenerateSerializeOneExtensionRange(printer,
2376
+ sorted_extensions[j++],
2377
+ to_array);
2378
+ } else if (j == sorted_extensions.size()) {
2379
+ GenerateSerializeOneField(printer, ordered_fields[i++], to_array);
2380
+ } else if (ordered_fields[i]->number() < sorted_extensions[j]->start) {
2381
+ GenerateSerializeOneField(printer, ordered_fields[i++], to_array);
2382
+ } else {
2383
+ GenerateSerializeOneExtensionRange(printer,
2384
+ sorted_extensions[j++],
2385
+ to_array);
2386
+ }
2387
+ }
2388
+
2389
+ if (UseUnknownFieldSet(descriptor_->file())) {
2390
+ printer->Print("if (!unknown_fields().empty()) {\n");
2391
+ printer->Indent();
2392
+ if (to_array) {
2393
+ printer->Print(
2394
+ "target = "
2395
+ "::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n"
2396
+ " unknown_fields(), target);\n");
2397
+ } else {
2398
+ printer->Print(
2399
+ "::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n"
2400
+ " unknown_fields(), output);\n");
2401
+ }
2402
+ printer->Outdent();
2403
+
2404
+ printer->Print(
2405
+ "}\n");
2406
+ } else {
2407
+ printer->Print(
2408
+ "output->WriteRaw(unknown_fields().data(),\n"
2409
+ " unknown_fields().size());\n");
2410
+ }
2411
+ }
2412
+
2413
+ void MessageGenerator::
2414
+ GenerateByteSize(io::Printer* printer) {
2415
+ if (descriptor_->options().message_set_wire_format()) {
2416
+ // Special-case MessageSet.
2417
+ printer->Print(
2418
+ "int $classname$::ByteSize() const {\n"
2419
+ " int total_size = _extensions_.MessageSetByteSize();\n",
2420
+ "classname", classname_);
2421
+ GOOGLE_CHECK(UseUnknownFieldSet(descriptor_->file()));
2422
+ printer->Print(
2423
+ " total_size += ::google::protobuf::internal::WireFormat::\n"
2424
+ " ComputeUnknownMessageSetItemsSize(unknown_fields());\n");
2425
+ printer->Print(
2426
+ " GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
2427
+ " _cached_size_ = total_size;\n"
2428
+ " GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
2429
+ " return total_size;\n"
2430
+ "}\n");
2431
+ return;
2432
+ }
2433
+
2434
+ printer->Print(
2435
+ "int $classname$::ByteSize() const {\n",
2436
+ "classname", classname_);
2437
+ printer->Indent();
2438
+ printer->Print(
2439
+ "int total_size = 0;\n"
2440
+ "\n");
2441
+
2442
+ int last_index = -1;
2443
+
2444
+ for (int i = 0; i < descriptor_->field_count(); i++) {
2445
+ const FieldDescriptor* field = descriptor_->field(i);
2446
+
2447
+ if (!field->is_repeated() && !field->containing_oneof()) {
2448
+ // See above in GenerateClear for an explanation of this.
2449
+ // TODO(kenton): Share code? Unclear how to do so without
2450
+ // over-engineering.
2451
+ if ((i / 8) != (last_index / 8) ||
2452
+ last_index < 0) {
2453
+ if (last_index >= 0) {
2454
+ printer->Outdent();
2455
+ printer->Print("}\n");
2456
+ }
2457
+ printer->Print(
2458
+ "if (_has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\n",
2459
+ "index", SimpleItoa(field->index()));
2460
+ printer->Indent();
2461
+ }
2462
+ last_index = i;
2463
+
2464
+ PrintFieldComment(printer, field);
2465
+
2466
+ printer->Print(
2467
+ "if (has_$name$()) {\n",
2468
+ "name", FieldName(field));
2469
+ printer->Indent();
2470
+
2471
+ field_generators_.get(field).GenerateByteSize(printer);
2472
+
2473
+ printer->Outdent();
2474
+ printer->Print(
2475
+ "}\n"
2476
+ "\n");
2477
+ }
2478
+ }
2479
+
2480
+ if (last_index >= 0) {
2481
+ printer->Outdent();
2482
+ printer->Print("}\n");
2483
+ }
2484
+
2485
+ // Repeated fields don't use _has_bits_ so we count them in a separate
2486
+ // pass.
2487
+ for (int i = 0; i < descriptor_->field_count(); i++) {
2488
+ const FieldDescriptor* field = descriptor_->field(i);
2489
+
2490
+ if (field->is_repeated()) {
2491
+ PrintFieldComment(printer, field);
2492
+ field_generators_.get(field).GenerateByteSize(printer);
2493
+ printer->Print("\n");
2494
+ }
2495
+ }
2496
+
2497
+ // Fields inside a oneof don't use _has_bits_ so we count them in a separate
2498
+ // pass.
2499
+ for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
2500
+ printer->Print(
2501
+ "switch ($oneofname$_case()) {\n",
2502
+ "oneofname", descriptor_->oneof_decl(i)->name());
2503
+ printer->Indent();
2504
+ for (int j = 0; j < descriptor_->oneof_decl(i)->field_count(); j++) {
2505
+ const FieldDescriptor* field = descriptor_->oneof_decl(i)->field(j);
2506
+ PrintFieldComment(printer, field);
2507
+ printer->Print(
2508
+ "case k$field_name$: {\n",
2509
+ "field_name", UnderscoresToCamelCase(field->name(), true));
2510
+ printer->Indent();
2511
+ field_generators_.get(field).GenerateByteSize(printer);
2512
+ printer->Print(
2513
+ "break;\n");
2514
+ printer->Outdent();
2515
+ printer->Print(
2516
+ "}\n");
2517
+ }
2518
+ printer->Print(
2519
+ "case $cap_oneof_name$_NOT_SET: {\n"
2520
+ " break;\n"
2521
+ "}\n",
2522
+ "cap_oneof_name",
2523
+ ToUpper(descriptor_->oneof_decl(i)->name()));
2524
+ printer->Outdent();
2525
+ printer->Print(
2526
+ "}\n");
2527
+ }
2528
+
2529
+ if (descriptor_->extension_range_count() > 0) {
2530
+ printer->Print(
2531
+ "total_size += _extensions_.ByteSize();\n"
2532
+ "\n");
2533
+ }
2534
+
2535
+ if (UseUnknownFieldSet(descriptor_->file())) {
2536
+ printer->Print("if (!unknown_fields().empty()) {\n");
2537
+ printer->Indent();
2538
+ printer->Print(
2539
+ "total_size +=\n"
2540
+ " ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n"
2541
+ " unknown_fields());\n");
2542
+ printer->Outdent();
2543
+ printer->Print("}\n");
2544
+ } else {
2545
+ printer->Print(
2546
+ "total_size += unknown_fields().size();\n"
2547
+ "\n");
2548
+ }
2549
+
2550
+ // We update _cached_size_ even though this is a const method. In theory,
2551
+ // this is not thread-compatible, because concurrent writes have undefined
2552
+ // results. In practice, since any concurrent writes will be writing the
2553
+ // exact same value, it works on all common processors. In a future version
2554
+ // of C++, _cached_size_ should be made into an atomic<int>.
2555
+ printer->Print(
2556
+ "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n"
2557
+ "_cached_size_ = total_size;\n"
2558
+ "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n"
2559
+ "return total_size;\n");
2560
+
2561
+ printer->Outdent();
2562
+ printer->Print("}\n");
2563
+ }
2564
+
2565
+ void MessageGenerator::
2566
+ GenerateIsInitialized(io::Printer* printer) {
2567
+ printer->Print(
2568
+ "bool $classname$::IsInitialized() const {\n",
2569
+ "classname", classname_);
2570
+ printer->Indent();
2571
+
2572
+ // Check that all required fields in this message are set. We can do this
2573
+ // most efficiently by checking 32 "has bits" at a time.
2574
+ int has_bits_array_size = (descriptor_->field_count() + 31) / 32;
2575
+ for (int i = 0; i < has_bits_array_size; i++) {
2576
+ uint32 mask = 0;
2577
+ for (int bit = 0; bit < 32; bit++) {
2578
+ int index = i * 32 + bit;
2579
+ if (index >= descriptor_->field_count()) break;
2580
+ const FieldDescriptor* field = descriptor_->field(index);
2581
+
2582
+ if (field->is_required()) {
2583
+ mask |= 1 << bit;
2584
+ }
2585
+ }
2586
+
2587
+ if (mask != 0) {
2588
+ char buffer[kFastToBufferSize];
2589
+ printer->Print(
2590
+ "if ((_has_bits_[$i$] & 0x$mask$) != 0x$mask$) return false;\n",
2591
+ "i", SimpleItoa(i),
2592
+ "mask", FastHex32ToBuffer(mask, buffer));
2593
+ }
2594
+ }
2595
+
2596
+ // Now check that all embedded messages are initialized.
2597
+ printer->Print("\n");
2598
+ for (int i = 0; i < descriptor_->field_count(); i++) {
2599
+ const FieldDescriptor* field = descriptor_->field(i);
2600
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE &&
2601
+ !ShouldIgnoreRequiredFieldCheck(field) &&
2602
+ HasRequiredFields(field->message_type())) {
2603
+ if (field->is_repeated()) {
2604
+ printer->Print(
2605
+ "if (!::google::protobuf::internal::AllAreInitialized(this->$name$()))"
2606
+ " return false;\n",
2607
+ "name", FieldName(field));
2608
+ } else {
2609
+ if (field->options().weak()) {
2610
+ // For weak fields, use the data member (google::protobuf::Message*) instead
2611
+ // of the getter to avoid a link dependency on the weak message type
2612
+ // which is only forward declared.
2613
+ printer->Print(
2614
+ "if (has_$name$()) {\n"
2615
+ " if (!this->$name$_->IsInitialized()) return false;\n"
2616
+ "}\n",
2617
+ "name", FieldName(field));
2618
+ } else {
2619
+ printer->Print(
2620
+ "if (has_$name$()) {\n"
2621
+ " if (!this->$name$().IsInitialized()) return false;\n"
2622
+ "}\n",
2623
+ "name", FieldName(field));
2624
+ }
2625
+ }
2626
+ }
2627
+ }
2628
+
2629
+ if (descriptor_->extension_range_count() > 0) {
2630
+ printer->Print(
2631
+ "\n"
2632
+ "if (!_extensions_.IsInitialized()) return false;");
2633
+ }
2634
+
2635
+ printer->Outdent();
2636
+ printer->Print(
2637
+ " return true;\n"
2638
+ "}\n");
2639
+ }
2640
+
2641
+
2642
+ } // namespace cpp
2643
+ } // namespace compiler
2644
+ } // namespace protobuf
2645
+ } // namespace google