protobuf 2.2.5-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. data/.gitignore +17 -0
  2. data/.travis.yml +9 -0
  3. data/.yardopts +5 -0
  4. data/Gemfile +3 -0
  5. data/README.md +316 -0
  6. data/Rakefile +29 -0
  7. data/UPGRADING.md +60 -0
  8. data/bin/rpc_server +5 -0
  9. data/bin/rprotoc +62 -0
  10. data/examples/addressbook.pb.rb +55 -0
  11. data/examples/addressbook.proto +24 -0
  12. data/examples/reading_a_message.rb +32 -0
  13. data/examples/writing_a_message.rb +46 -0
  14. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/code_generator.h +142 -0
  15. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/command_line_interface.h +318 -0
  16. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum.h +99 -0
  17. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_enum_field.h +103 -0
  18. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_extension.h +85 -0
  19. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_field.h +167 -0
  20. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_file.h +98 -0
  21. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  22. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_helpers.h +159 -0
  23. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message.h +170 -0
  24. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_message_field.h +102 -0
  25. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +103 -0
  26. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  27. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_string_field.h +104 -0
  28. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h +2721 -0
  29. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/importer.h +303 -0
  30. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum.h +84 -0
  31. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_enum_field.h +121 -0
  32. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_extension.h +77 -0
  33. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_field.h +108 -0
  34. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_file.h +101 -0
  35. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_generator.h +72 -0
  36. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_helpers.h +213 -0
  37. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message.h +109 -0
  38. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_message_field.h +134 -0
  39. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_primitive_field.h +121 -0
  40. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_service.h +113 -0
  41. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/java/java_string_field.h +120 -0
  42. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/mock_code_generator.h +113 -0
  43. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/package_info.h +64 -0
  44. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/parser.h +434 -0
  45. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.h +73 -0
  46. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/plugin.pb.h +790 -0
  47. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/python/python_generator.h +156 -0
  48. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/subprocess.h +108 -0
  49. data/ext/protobuf-2.4.1/src/google/protobuf/compiler/zip_writer.h +93 -0
  50. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.h +1367 -0
  51. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor.pb.h +5223 -0
  52. data/ext/protobuf-2.4.1/src/google/protobuf/descriptor_database.h +366 -0
  53. data/ext/protobuf-2.4.1/src/google/protobuf/dynamic_message.h +136 -0
  54. data/ext/protobuf-2.4.1/src/google/protobuf/extension_set.h +904 -0
  55. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_reflection.h +424 -0
  56. data/ext/protobuf-2.4.1/src/google/protobuf/generated_message_util.h +82 -0
  57. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream.h +1102 -0
  58. data/ext/protobuf-2.4.1/src/google/protobuf/io/coded_stream_inl.h +64 -0
  59. data/ext/protobuf-2.4.1/src/google/protobuf/io/gzip_stream.h +207 -0
  60. data/ext/protobuf-2.4.1/src/google/protobuf/io/package_info.h +54 -0
  61. data/ext/protobuf-2.4.1/src/google/protobuf/io/printer.h +136 -0
  62. data/ext/protobuf-2.4.1/src/google/protobuf/io/tokenizer.h +313 -0
  63. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream.h +238 -0
  64. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl.h +357 -0
  65. data/ext/protobuf-2.4.1/src/google/protobuf/io/zero_copy_stream_impl_lite.h +340 -0
  66. data/ext/protobuf-2.4.1/src/google/protobuf/message.h +692 -0
  67. data/ext/protobuf-2.4.1/src/google/protobuf/message_lite.h +239 -0
  68. data/ext/protobuf-2.4.1/src/google/protobuf/package_info.h +64 -0
  69. data/ext/protobuf-2.4.1/src/google/protobuf/reflection_ops.h +80 -0
  70. data/ext/protobuf-2.4.1/src/google/protobuf/repeated_field.h +1295 -0
  71. data/ext/protobuf-2.4.1/src/google/protobuf/service.h +291 -0
  72. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/common.h +1211 -0
  73. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/hash.h +220 -0
  74. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/map-util.h +119 -0
  75. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/once.h +123 -0
  76. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/stl_util-inl.h +121 -0
  77. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/strutil.h +457 -0
  78. data/ext/protobuf-2.4.1/src/google/protobuf/stubs/substitute.h +170 -0
  79. data/ext/protobuf-2.4.1/src/google/protobuf/test_util.h +174 -0
  80. data/ext/protobuf-2.4.1/src/google/protobuf/test_util_lite.h +101 -0
  81. data/ext/protobuf-2.4.1/src/google/protobuf/testing/file.h +83 -0
  82. data/ext/protobuf-2.4.1/src/google/protobuf/testing/googletest.h +98 -0
  83. data/ext/protobuf-2.4.1/src/google/protobuf/text_format.h +285 -0
  84. data/ext/protobuf-2.4.1/src/google/protobuf/unittest.pb.h +11915 -0
  85. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_custom_options.pb.h +2895 -0
  86. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_embed_optimize_for.pb.h +211 -0
  87. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_empty.pb.h +56 -0
  88. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import.pb.h +188 -0
  89. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_import_lite.pb.h +151 -0
  90. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite.pb.h +4752 -0
  91. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_lite_imports_nonlite.pb.h +150 -0
  92. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_mset.pb.h +816 -0
  93. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_no_generic_services.pb.h +197 -0
  94. data/ext/protobuf-2.4.1/src/google/protobuf/unittest_optimize_for.pb.h +403 -0
  95. data/ext/protobuf-2.4.1/src/google/protobuf/unknown_field_set.h +268 -0
  96. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format.h +304 -0
  97. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite.h +620 -0
  98. data/ext/protobuf-2.4.1/src/google/protobuf/wire_format_lite_inl.h +774 -0
  99. data/ext/ruby_generator/Makefile +10 -0
  100. data/ext/ruby_generator/RubyGenerator.cpp +450 -0
  101. data/ext/ruby_generator/RubyGenerator.h +199 -0
  102. data/ext/ruby_generator/extconf.rb +36 -0
  103. data/ext/ruby_generator/protoc-ruby +0 -0
  104. data/lib/protobuf/cli.rb +188 -0
  105. data/lib/protobuf/enum.rb +58 -0
  106. data/lib/protobuf/enum_value.rb +59 -0
  107. data/lib/protobuf/evented.rb +22 -0
  108. data/lib/protobuf/exceptions.rb +11 -0
  109. data/lib/protobuf/ext/eventmachine.rb +14 -0
  110. data/lib/protobuf/field/base_field.rb +240 -0
  111. data/lib/protobuf/field/bool_field.rb +36 -0
  112. data/lib/protobuf/field/bytes_field.rb +38 -0
  113. data/lib/protobuf/field/double_field.rb +19 -0
  114. data/lib/protobuf/field/enum_field.rb +50 -0
  115. data/lib/protobuf/field/extension_fields.rb +32 -0
  116. data/lib/protobuf/field/field_array.rb +65 -0
  117. data/lib/protobuf/field/fixed32_field.rb +19 -0
  118. data/lib/protobuf/field/fixed64_field.rb +22 -0
  119. data/lib/protobuf/field/float_field.rb +31 -0
  120. data/lib/protobuf/field/int32_field.rb +12 -0
  121. data/lib/protobuf/field/int64_field.rb +12 -0
  122. data/lib/protobuf/field/integer_field.rb +19 -0
  123. data/lib/protobuf/field/message_field.rb +53 -0
  124. data/lib/protobuf/field/sfixed32_field.rb +21 -0
  125. data/lib/protobuf/field/sfixed64_field.rb +24 -0
  126. data/lib/protobuf/field/signed_integer_field.rb +23 -0
  127. data/lib/protobuf/field/sint32_field.rb +12 -0
  128. data/lib/protobuf/field/sint64_field.rb +12 -0
  129. data/lib/protobuf/field/string_field.rb +14 -0
  130. data/lib/protobuf/field/uint32_field.rb +12 -0
  131. data/lib/protobuf/field/uint64_field.rb +12 -0
  132. data/lib/protobuf/field/varint_field.rb +61 -0
  133. data/lib/protobuf/field.rb +57 -0
  134. data/lib/protobuf/logger.rb +86 -0
  135. data/lib/protobuf/message/decoder.rb +83 -0
  136. data/lib/protobuf/message/encoder.rb +48 -0
  137. data/lib/protobuf/message/extend.rb +8 -0
  138. data/lib/protobuf/message/message.rb +1 -0
  139. data/lib/protobuf/message.rb +320 -0
  140. data/lib/protobuf/rpc/buffer.rb +79 -0
  141. data/lib/protobuf/rpc/client.rb +166 -0
  142. data/lib/protobuf/rpc/connector.rb +19 -0
  143. data/lib/protobuf/rpc/connectors/base.rb +38 -0
  144. data/lib/protobuf/rpc/connectors/common.rb +156 -0
  145. data/lib/protobuf/rpc/connectors/em_client.rb +84 -0
  146. data/lib/protobuf/rpc/connectors/eventmachine.rb +87 -0
  147. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  148. data/lib/protobuf/rpc/connectors/zmq.rb +69 -0
  149. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  150. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  151. data/lib/protobuf/rpc/error.rb +25 -0
  152. data/lib/protobuf/rpc/rpc.pb.rb +118 -0
  153. data/lib/protobuf/rpc/server.rb +89 -0
  154. data/lib/protobuf/rpc/servers/evented/server.rb +41 -0
  155. data/lib/protobuf/rpc/servers/evented_runner.rb +21 -0
  156. data/lib/protobuf/rpc/servers/socket/server.rb +111 -0
  157. data/lib/protobuf/rpc/servers/socket/worker.rb +66 -0
  158. data/lib/protobuf/rpc/servers/socket_runner.rb +27 -0
  159. data/lib/protobuf/rpc/servers/zmq/broker.rb +87 -0
  160. data/lib/protobuf/rpc/servers/zmq/server.rb +50 -0
  161. data/lib/protobuf/rpc/servers/zmq/util.rb +27 -0
  162. data/lib/protobuf/rpc/servers/zmq/worker.rb +60 -0
  163. data/lib/protobuf/rpc/servers/zmq_runner.rb +25 -0
  164. data/lib/protobuf/rpc/service.rb +173 -0
  165. data/lib/protobuf/rpc/service_dispatcher.rb +130 -0
  166. data/lib/protobuf/rpc/service_filters.rb +267 -0
  167. data/lib/protobuf/rpc/stat.rb +83 -0
  168. data/lib/protobuf/socket.rb +22 -0
  169. data/lib/protobuf/version.rb +4 -0
  170. data/lib/protobuf/wire_type.rb +10 -0
  171. data/lib/protobuf/zmq.rb +21 -0
  172. data/lib/protobuf.rb +86 -0
  173. data/proto/rpc.pb.rb +48 -0
  174. data/proto/rpc.proto +73 -0
  175. data/protobuf.gemspec +44 -0
  176. data/spec/benchmark/tasks.rb +179 -0
  177. data/spec/functional/embedded_service_spec.rb +7 -0
  178. data/spec/functional/evented_server_spec.rb +64 -0
  179. data/spec/functional/socket_server_spec.rb +58 -0
  180. data/spec/functional/zmq_server_spec.rb +58 -0
  181. data/spec/lib/protobuf/cli_spec.rb +212 -0
  182. data/spec/lib/protobuf/enum_spec.rb +98 -0
  183. data/spec/lib/protobuf/enum_value_spec.rb +15 -0
  184. data/spec/lib/protobuf/logger_spec.rb +131 -0
  185. data/spec/lib/protobuf/message/encoder_spec.rb +19 -0
  186. data/spec/lib/protobuf/message_spec.rb +209 -0
  187. data/spec/lib/protobuf/rpc/client_spec.rb +158 -0
  188. data/spec/lib/protobuf/rpc/connector_spec.rb +32 -0
  189. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  190. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +128 -0
  191. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  192. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +22 -0
  193. data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +18 -0
  194. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +43 -0
  195. data/spec/lib/protobuf/rpc/servers/zmq/broker_spec.rb +35 -0
  196. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +41 -0
  197. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +45 -0
  198. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +44 -0
  199. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +116 -0
  200. data/spec/lib/protobuf/rpc/service_filters_spec.rb +451 -0
  201. data/spec/lib/protobuf/rpc/service_spec.rb +165 -0
  202. data/spec/lib/protobuf_spec.rb +62 -0
  203. data/spec/spec_helper.rb +51 -0
  204. data/spec/support/all.rb +6 -0
  205. data/spec/support/server.rb +101 -0
  206. data/spec/support/test/enum.pb.rb +34 -0
  207. data/spec/support/test/enum.proto +12 -0
  208. data/spec/support/test/resource.pb.rb +58 -0
  209. data/spec/support/test/resource.proto +31 -0
  210. data/spec/support/test/resource_service.rb +14 -0
  211. data/spec/support/test_app_file.rb +2 -0
  212. data/spec/support/tolerance_matcher.rb +40 -0
  213. data/test/data/data.bin +3 -0
  214. data/test/data/data_source.py +14 -0
  215. data/test/data/types.bin +0 -0
  216. data/test/data/types_source.py +22 -0
  217. data/test/data/unk.png +0 -0
  218. data/test/proto/addressbook.pb.rb +66 -0
  219. data/test/proto/addressbook.proto +33 -0
  220. data/test/proto/addressbook_base.pb.rb +58 -0
  221. data/test/proto/addressbook_base.proto +26 -0
  222. data/test/proto/addressbook_ext.pb.rb +20 -0
  223. data/test/proto/addressbook_ext.proto +6 -0
  224. data/test/proto/collision.pb.rb +17 -0
  225. data/test/proto/collision.proto +5 -0
  226. data/test/proto/ext_collision.pb.rb +24 -0
  227. data/test/proto/ext_collision.proto +8 -0
  228. data/test/proto/ext_range.pb.rb +22 -0
  229. data/test/proto/ext_range.proto +7 -0
  230. data/test/proto/float_default.proto +10 -0
  231. data/test/proto/lowercase.pb.rb +30 -0
  232. data/test/proto/lowercase.proto +9 -0
  233. data/test/proto/merge.pb.rb +39 -0
  234. data/test/proto/merge.proto +15 -0
  235. data/test/proto/nested.pb.rb +30 -0
  236. data/test/proto/nested.proto +9 -0
  237. data/test/proto/optional_field.pb.rb +35 -0
  238. data/test/proto/optional_field.proto +12 -0
  239. data/test/proto/packed.pb.rb +22 -0
  240. data/test/proto/packed.proto +6 -0
  241. data/test/proto/rpc.proto +6 -0
  242. data/test/proto/types.pb.rb +84 -0
  243. data/test/proto/types.proto +37 -0
  244. data/test/test_addressbook.rb +56 -0
  245. data/test/test_enum_value.rb +41 -0
  246. data/test/test_extension.rb +36 -0
  247. data/test/test_lowercase.rb +11 -0
  248. data/test/test_message.rb +128 -0
  249. data/test/test_optional_field.rb +103 -0
  250. data/test/test_packed_field.rb +40 -0
  251. data/test/test_parse.rb +15 -0
  252. data/test/test_repeated_types.rb +132 -0
  253. data/test/test_serialize.rb +61 -0
  254. data/test/test_standard_message.rb +96 -0
  255. data/test/test_types.rb +226 -0
  256. metadata +461 -0
@@ -0,0 +1,457 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
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
+ // from google3/strings/strutil.h
32
+
33
+ #ifndef GOOGLE_PROTOBUF_STUBS_STRUTIL_H__
34
+ #define GOOGLE_PROTOBUF_STUBS_STRUTIL_H__
35
+
36
+ #include <stdlib.h>
37
+ #include <vector>
38
+ #include <google/protobuf/stubs/common.h>
39
+
40
+ namespace google {
41
+ namespace protobuf {
42
+
43
+ #ifdef _MSC_VER
44
+ #define strtoll _strtoi64
45
+ #define strtoull _strtoui64
46
+ #elif defined(__DECCXX) && defined(__osf__)
47
+ // HP C++ on Tru64 does not have strtoll, but strtol is already 64-bit.
48
+ #define strtoll strtol
49
+ #define strtoull strtoul
50
+ #endif
51
+
52
+ // ----------------------------------------------------------------------
53
+ // ascii_isalnum()
54
+ // Check if an ASCII character is alphanumeric. We can't use ctype's
55
+ // isalnum() because it is affected by locale. This function is applied
56
+ // to identifiers in the protocol buffer language, not to natural-language
57
+ // strings, so locale should not be taken into account.
58
+ // ascii_isdigit()
59
+ // Like above, but only accepts digits.
60
+ // ----------------------------------------------------------------------
61
+
62
+ inline bool ascii_isalnum(char c) {
63
+ return ('a' <= c && c <= 'z') ||
64
+ ('A' <= c && c <= 'Z') ||
65
+ ('0' <= c && c <= '9');
66
+ }
67
+
68
+ inline bool ascii_isdigit(char c) {
69
+ return ('0' <= c && c <= '9');
70
+ }
71
+
72
+ // ----------------------------------------------------------------------
73
+ // HasPrefixString()
74
+ // Check if a string begins with a given prefix.
75
+ // StripPrefixString()
76
+ // Given a string and a putative prefix, returns the string minus the
77
+ // prefix string if the prefix matches, otherwise the original
78
+ // string.
79
+ // ----------------------------------------------------------------------
80
+ inline bool HasPrefixString(const string& str,
81
+ const string& prefix) {
82
+ return str.size() >= prefix.size() &&
83
+ str.compare(0, prefix.size(), prefix) == 0;
84
+ }
85
+
86
+ inline string StripPrefixString(const string& str, const string& prefix) {
87
+ if (HasPrefixString(str, prefix)) {
88
+ return str.substr(prefix.size());
89
+ } else {
90
+ return str;
91
+ }
92
+ }
93
+
94
+ // ----------------------------------------------------------------------
95
+ // HasSuffixString()
96
+ // Return true if str ends in suffix.
97
+ // StripSuffixString()
98
+ // Given a string and a putative suffix, returns the string minus the
99
+ // suffix string if the suffix matches, otherwise the original
100
+ // string.
101
+ // ----------------------------------------------------------------------
102
+ inline bool HasSuffixString(const string& str,
103
+ const string& suffix) {
104
+ return str.size() >= suffix.size() &&
105
+ str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
106
+ }
107
+
108
+ inline string StripSuffixString(const string& str, const string& suffix) {
109
+ if (HasSuffixString(str, suffix)) {
110
+ return str.substr(0, str.size() - suffix.size());
111
+ } else {
112
+ return str;
113
+ }
114
+ }
115
+
116
+ // ----------------------------------------------------------------------
117
+ // StripString
118
+ // Replaces any occurrence of the character 'remove' (or the characters
119
+ // in 'remove') with the character 'replacewith'.
120
+ // Good for keeping html characters or protocol characters (\t) out
121
+ // of places where they might cause a problem.
122
+ // ----------------------------------------------------------------------
123
+ LIBPROTOBUF_EXPORT void StripString(string* s, const char* remove,
124
+ char replacewith);
125
+
126
+ // ----------------------------------------------------------------------
127
+ // LowerString()
128
+ // UpperString()
129
+ // Convert the characters in "s" to lowercase or uppercase. ASCII-only:
130
+ // these functions intentionally ignore locale because they are applied to
131
+ // identifiers used in the Protocol Buffer language, not to natural-language
132
+ // strings.
133
+ // ----------------------------------------------------------------------
134
+
135
+ inline void LowerString(string * s) {
136
+ string::iterator end = s->end();
137
+ for (string::iterator i = s->begin(); i != end; ++i) {
138
+ // tolower() changes based on locale. We don't want this!
139
+ if ('A' <= *i && *i <= 'Z') *i += 'a' - 'A';
140
+ }
141
+ }
142
+
143
+ inline void UpperString(string * s) {
144
+ string::iterator end = s->end();
145
+ for (string::iterator i = s->begin(); i != end; ++i) {
146
+ // toupper() changes based on locale. We don't want this!
147
+ if ('a' <= *i && *i <= 'z') *i += 'A' - 'a';
148
+ }
149
+ }
150
+
151
+ // ----------------------------------------------------------------------
152
+ // StringReplace()
153
+ // Give me a string and two patterns "old" and "new", and I replace
154
+ // the first instance of "old" in the string with "new", if it
155
+ // exists. RETURN a new string, regardless of whether the replacement
156
+ // happened or not.
157
+ // ----------------------------------------------------------------------
158
+
159
+ LIBPROTOBUF_EXPORT string StringReplace(const string& s, const string& oldsub,
160
+ const string& newsub, bool replace_all);
161
+
162
+ // ----------------------------------------------------------------------
163
+ // SplitStringUsing()
164
+ // Split a string using a character delimiter. Append the components
165
+ // to 'result'. If there are consecutive delimiters, this function skips
166
+ // over all of them.
167
+ // ----------------------------------------------------------------------
168
+ LIBPROTOBUF_EXPORT void SplitStringUsing(const string& full, const char* delim,
169
+ vector<string>* res);
170
+
171
+ // ----------------------------------------------------------------------
172
+ // JoinStrings()
173
+ // These methods concatenate a vector of strings into a C++ string, using
174
+ // the C-string "delim" as a separator between components. There are two
175
+ // flavors of the function, one flavor returns the concatenated string,
176
+ // another takes a pointer to the target string. In the latter case the
177
+ // target string is cleared and overwritten.
178
+ // ----------------------------------------------------------------------
179
+ LIBPROTOBUF_EXPORT void JoinStrings(const vector<string>& components,
180
+ const char* delim, string* result);
181
+
182
+ inline string JoinStrings(const vector<string>& components,
183
+ const char* delim) {
184
+ string result;
185
+ JoinStrings(components, delim, &result);
186
+ return result;
187
+ }
188
+
189
+ // ----------------------------------------------------------------------
190
+ // UnescapeCEscapeSequences()
191
+ // Copies "source" to "dest", rewriting C-style escape sequences
192
+ // -- '\n', '\r', '\\', '\ooo', etc -- to their ASCII
193
+ // equivalents. "dest" must be sufficiently large to hold all
194
+ // the characters in the rewritten string (i.e. at least as large
195
+ // as strlen(source) + 1 should be safe, since the replacements
196
+ // are always shorter than the original escaped sequences). It's
197
+ // safe for source and dest to be the same. RETURNS the length
198
+ // of dest.
199
+ //
200
+ // It allows hex sequences \xhh, or generally \xhhhhh with an
201
+ // arbitrary number of hex digits, but all of them together must
202
+ // specify a value of a single byte (e.g. \x0045 is equivalent
203
+ // to \x45, and \x1234 is erroneous).
204
+ //
205
+ // It also allows escape sequences of the form \uhhhh (exactly four
206
+ // hex digits, upper or lower case) or \Uhhhhhhhh (exactly eight
207
+ // hex digits, upper or lower case) to specify a Unicode code
208
+ // point. The dest array will contain the UTF8-encoded version of
209
+ // that code-point (e.g., if source contains \u2019, then dest will
210
+ // contain the three bytes 0xE2, 0x80, and 0x99).
211
+ //
212
+ // Errors: In the first form of the call, errors are reported with
213
+ // LOG(ERROR). The same is true for the second form of the call if
214
+ // the pointer to the string vector is NULL; otherwise, error
215
+ // messages are stored in the vector. In either case, the effect on
216
+ // the dest array is not defined, but rest of the source will be
217
+ // processed.
218
+ // ----------------------------------------------------------------------
219
+
220
+ LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest);
221
+ LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest,
222
+ vector<string> *errors);
223
+
224
+ // ----------------------------------------------------------------------
225
+ // UnescapeCEscapeString()
226
+ // This does the same thing as UnescapeCEscapeSequences, but creates
227
+ // a new string. The caller does not need to worry about allocating
228
+ // a dest buffer. This should be used for non performance critical
229
+ // tasks such as printing debug messages. It is safe for src and dest
230
+ // to be the same.
231
+ //
232
+ // The second call stores its errors in a supplied string vector.
233
+ // If the string vector pointer is NULL, it reports the errors with LOG().
234
+ //
235
+ // In the first and second calls, the length of dest is returned. In the
236
+ // the third call, the new string is returned.
237
+ // ----------------------------------------------------------------------
238
+
239
+ LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest);
240
+ LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest,
241
+ vector<string> *errors);
242
+ LIBPROTOBUF_EXPORT string UnescapeCEscapeString(const string& src);
243
+
244
+ // ----------------------------------------------------------------------
245
+ // CEscapeString()
246
+ // Copies 'src' to 'dest', escaping dangerous characters using
247
+ // C-style escape sequences. This is very useful for preparing query
248
+ // flags. 'src' and 'dest' should not overlap.
249
+ // Returns the number of bytes written to 'dest' (not including the \0)
250
+ // or -1 if there was insufficient space.
251
+ //
252
+ // Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped.
253
+ // ----------------------------------------------------------------------
254
+ LIBPROTOBUF_EXPORT int CEscapeString(const char* src, int src_len,
255
+ char* dest, int dest_len);
256
+
257
+ // ----------------------------------------------------------------------
258
+ // CEscape()
259
+ // More convenient form of CEscapeString: returns result as a "string".
260
+ // This version is slower than CEscapeString() because it does more
261
+ // allocation. However, it is much more convenient to use in
262
+ // non-speed-critical code like logging messages etc.
263
+ // ----------------------------------------------------------------------
264
+ LIBPROTOBUF_EXPORT string CEscape(const string& src);
265
+
266
+ namespace strings {
267
+ // Like CEscape() but does not escape bytes with the upper bit set.
268
+ LIBPROTOBUF_EXPORT string Utf8SafeCEscape(const string& src);
269
+
270
+ // Like CEscape() but uses hex (\x) escapes instead of octals.
271
+ LIBPROTOBUF_EXPORT string CHexEscape(const string& src);
272
+ } // namespace strings
273
+
274
+ // ----------------------------------------------------------------------
275
+ // strto32()
276
+ // strtou32()
277
+ // strto64()
278
+ // strtou64()
279
+ // Architecture-neutral plug compatible replacements for strtol() and
280
+ // strtoul(). Long's have different lengths on ILP-32 and LP-64
281
+ // platforms, so using these is safer, from the point of view of
282
+ // overflow behavior, than using the standard libc functions.
283
+ // ----------------------------------------------------------------------
284
+ LIBPROTOBUF_EXPORT int32 strto32_adaptor(const char *nptr, char **endptr,
285
+ int base);
286
+ LIBPROTOBUF_EXPORT uint32 strtou32_adaptor(const char *nptr, char **endptr,
287
+ int base);
288
+
289
+ inline int32 strto32(const char *nptr, char **endptr, int base) {
290
+ if (sizeof(int32) == sizeof(long))
291
+ return strtol(nptr, endptr, base);
292
+ else
293
+ return strto32_adaptor(nptr, endptr, base);
294
+ }
295
+
296
+ inline uint32 strtou32(const char *nptr, char **endptr, int base) {
297
+ if (sizeof(uint32) == sizeof(unsigned long))
298
+ return strtoul(nptr, endptr, base);
299
+ else
300
+ return strtou32_adaptor(nptr, endptr, base);
301
+ }
302
+
303
+ // For now, long long is 64-bit on all the platforms we care about, so these
304
+ // functions can simply pass the call to strto[u]ll.
305
+ inline int64 strto64(const char *nptr, char **endptr, int base) {
306
+ GOOGLE_COMPILE_ASSERT(sizeof(int64) == sizeof(long long),
307
+ sizeof_int64_is_not_sizeof_long_long);
308
+ return strtoll(nptr, endptr, base);
309
+ }
310
+
311
+ inline uint64 strtou64(const char *nptr, char **endptr, int base) {
312
+ GOOGLE_COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long),
313
+ sizeof_uint64_is_not_sizeof_long_long);
314
+ return strtoull(nptr, endptr, base);
315
+ }
316
+
317
+ // ----------------------------------------------------------------------
318
+ // FastIntToBuffer()
319
+ // FastHexToBuffer()
320
+ // FastHex64ToBuffer()
321
+ // FastHex32ToBuffer()
322
+ // FastTimeToBuffer()
323
+ // These are intended for speed. FastIntToBuffer() assumes the
324
+ // integer is non-negative. FastHexToBuffer() puts output in
325
+ // hex rather than decimal. FastTimeToBuffer() puts the output
326
+ // into RFC822 format.
327
+ //
328
+ // FastHex64ToBuffer() puts a 64-bit unsigned value in hex-format,
329
+ // padded to exactly 16 bytes (plus one byte for '\0')
330
+ //
331
+ // FastHex32ToBuffer() puts a 32-bit unsigned value in hex-format,
332
+ // padded to exactly 8 bytes (plus one byte for '\0')
333
+ //
334
+ // All functions take the output buffer as an arg.
335
+ // They all return a pointer to the beginning of the output,
336
+ // which may not be the beginning of the input buffer.
337
+ // ----------------------------------------------------------------------
338
+
339
+ // Suggested buffer size for FastToBuffer functions. Also works with
340
+ // DoubleToBuffer() and FloatToBuffer().
341
+ static const int kFastToBufferSize = 32;
342
+
343
+ LIBPROTOBUF_EXPORT char* FastInt32ToBuffer(int32 i, char* buffer);
344
+ LIBPROTOBUF_EXPORT char* FastInt64ToBuffer(int64 i, char* buffer);
345
+ char* FastUInt32ToBuffer(uint32 i, char* buffer); // inline below
346
+ char* FastUInt64ToBuffer(uint64 i, char* buffer); // inline below
347
+ LIBPROTOBUF_EXPORT char* FastHexToBuffer(int i, char* buffer);
348
+ LIBPROTOBUF_EXPORT char* FastHex64ToBuffer(uint64 i, char* buffer);
349
+ LIBPROTOBUF_EXPORT char* FastHex32ToBuffer(uint32 i, char* buffer);
350
+
351
+ // at least 22 bytes long
352
+ inline char* FastIntToBuffer(int i, char* buffer) {
353
+ return (sizeof(i) == 4 ?
354
+ FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer));
355
+ }
356
+ inline char* FastUIntToBuffer(unsigned int i, char* buffer) {
357
+ return (sizeof(i) == 4 ?
358
+ FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer));
359
+ }
360
+ inline char* FastLongToBuffer(long i, char* buffer) {
361
+ return (sizeof(i) == 4 ?
362
+ FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer));
363
+ }
364
+ inline char* FastULongToBuffer(unsigned long i, char* buffer) {
365
+ return (sizeof(i) == 4 ?
366
+ FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer));
367
+ }
368
+
369
+ // ----------------------------------------------------------------------
370
+ // FastInt32ToBufferLeft()
371
+ // FastUInt32ToBufferLeft()
372
+ // FastInt64ToBufferLeft()
373
+ // FastUInt64ToBufferLeft()
374
+ //
375
+ // Like the Fast*ToBuffer() functions above, these are intended for speed.
376
+ // Unlike the Fast*ToBuffer() functions, however, these functions write
377
+ // their output to the beginning of the buffer (hence the name, as the
378
+ // output is left-aligned). The caller is responsible for ensuring that
379
+ // the buffer has enough space to hold the output.
380
+ //
381
+ // Returns a pointer to the end of the string (i.e. the null character
382
+ // terminating the string).
383
+ // ----------------------------------------------------------------------
384
+
385
+ LIBPROTOBUF_EXPORT char* FastInt32ToBufferLeft(int32 i, char* buffer);
386
+ LIBPROTOBUF_EXPORT char* FastUInt32ToBufferLeft(uint32 i, char* buffer);
387
+ LIBPROTOBUF_EXPORT char* FastInt64ToBufferLeft(int64 i, char* buffer);
388
+ LIBPROTOBUF_EXPORT char* FastUInt64ToBufferLeft(uint64 i, char* buffer);
389
+
390
+ // Just define these in terms of the above.
391
+ inline char* FastUInt32ToBuffer(uint32 i, char* buffer) {
392
+ FastUInt32ToBufferLeft(i, buffer);
393
+ return buffer;
394
+ }
395
+ inline char* FastUInt64ToBuffer(uint64 i, char* buffer) {
396
+ FastUInt64ToBufferLeft(i, buffer);
397
+ return buffer;
398
+ }
399
+
400
+ // ----------------------------------------------------------------------
401
+ // SimpleItoa()
402
+ // Description: converts an integer to a string.
403
+ //
404
+ // Return value: string
405
+ // ----------------------------------------------------------------------
406
+ LIBPROTOBUF_EXPORT string SimpleItoa(int i);
407
+ LIBPROTOBUF_EXPORT string SimpleItoa(unsigned int i);
408
+ LIBPROTOBUF_EXPORT string SimpleItoa(long i);
409
+ LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long i);
410
+ LIBPROTOBUF_EXPORT string SimpleItoa(long long i);
411
+ LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long long i);
412
+
413
+ // ----------------------------------------------------------------------
414
+ // SimpleDtoa()
415
+ // SimpleFtoa()
416
+ // DoubleToBuffer()
417
+ // FloatToBuffer()
418
+ // Description: converts a double or float to a string which, if
419
+ // passed to NoLocaleStrtod(), will produce the exact same original double
420
+ // (except in case of NaN; all NaNs are considered the same value).
421
+ // We try to keep the string short but it's not guaranteed to be as
422
+ // short as possible.
423
+ //
424
+ // DoubleToBuffer() and FloatToBuffer() write the text to the given
425
+ // buffer and return it. The buffer must be at least
426
+ // kDoubleToBufferSize bytes for doubles and kFloatToBufferSize
427
+ // bytes for floats. kFastToBufferSize is also guaranteed to be large
428
+ // enough to hold either.
429
+ //
430
+ // Return value: string
431
+ // ----------------------------------------------------------------------
432
+ LIBPROTOBUF_EXPORT string SimpleDtoa(double value);
433
+ LIBPROTOBUF_EXPORT string SimpleFtoa(float value);
434
+
435
+ LIBPROTOBUF_EXPORT char* DoubleToBuffer(double i, char* buffer);
436
+ LIBPROTOBUF_EXPORT char* FloatToBuffer(float i, char* buffer);
437
+
438
+ // In practice, doubles should never need more than 24 bytes and floats
439
+ // should never need more than 14 (including null terminators), but we
440
+ // overestimate to be safe.
441
+ static const int kDoubleToBufferSize = 32;
442
+ static const int kFloatToBufferSize = 24;
443
+
444
+ // ----------------------------------------------------------------------
445
+ // NoLocaleStrtod()
446
+ // Exactly like strtod(), except it always behaves as if in the "C"
447
+ // locale (i.e. decimal points must be '.'s).
448
+ // ----------------------------------------------------------------------
449
+
450
+ LIBPROTOBUF_EXPORT double NoLocaleStrtod(const char* text, char** endptr);
451
+
452
+ } // namespace protobuf
453
+ } // namespace google
454
+
455
+ #endif // GOOGLE_PROTOBUF_STUBS_STRUTIL_H__
456
+
457
+
@@ -0,0 +1,170 @@
1
+ // Protocol Buffers - Google's data interchange format
2
+ // Copyright 2008 Google Inc. All rights reserved.
3
+ // http://code.google.com/p/protobuf/
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
+ // from google3/strings/substitute.h
33
+
34
+ #include <string>
35
+ #include <google/protobuf/stubs/common.h>
36
+ #include <google/protobuf/stubs/strutil.h>
37
+
38
+ #ifndef GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_
39
+ #define GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_
40
+
41
+ namespace google {
42
+ namespace protobuf {
43
+ namespace strings {
44
+
45
+ // ----------------------------------------------------------------------
46
+ // strings::Substitute()
47
+ // strings::SubstituteAndAppend()
48
+ // Kind of like StringPrintf, but different.
49
+ //
50
+ // Example:
51
+ // string GetMessage(string first_name, string last_name, int age) {
52
+ // return strings::Substitute("My name is $0 $1 and I am $2 years old.",
53
+ // first_name, last_name, age);
54
+ // }
55
+ //
56
+ // Differences from StringPrintf:
57
+ // * The format string does not identify the types of arguments.
58
+ // Instead, the magic of C++ deals with this for us. See below
59
+ // for a list of accepted types.
60
+ // * Substitutions in the format string are identified by a '$'
61
+ // followed by a digit. So, you can use arguments out-of-order and
62
+ // use the same argument multiple times.
63
+ // * It's much faster than StringPrintf.
64
+ //
65
+ // Supported types:
66
+ // * Strings (const char*, const string&)
67
+ // * Note that this means you do not have to add .c_str() to all of
68
+ // your strings. In fact, you shouldn't; it will be slower.
69
+ // * int32, int64, uint32, uint64: Formatted using SimpleItoa().
70
+ // * float, double: Formatted using SimpleFtoa() and SimpleDtoa().
71
+ // * bool: Printed as "true" or "false".
72
+ //
73
+ // SubstituteAndAppend() is like Substitute() but appends the result to
74
+ // *output. Example:
75
+ //
76
+ // string str;
77
+ // strings::SubstituteAndAppend(&str,
78
+ // "My name is $0 $1 and I am $2 years old.",
79
+ // first_name, last_name, age);
80
+ //
81
+ // Substitute() is significantly faster than StringPrintf(). For very
82
+ // large strings, it may be orders of magnitude faster.
83
+ // ----------------------------------------------------------------------
84
+
85
+ namespace internal { // Implementation details.
86
+
87
+ class SubstituteArg {
88
+ public:
89
+ inline SubstituteArg(const char* value)
90
+ : text_(value), size_(strlen(text_)) {}
91
+ inline SubstituteArg(const string& value)
92
+ : text_(value.data()), size_(value.size()) {}
93
+
94
+ // Indicates that no argument was given.
95
+ inline explicit SubstituteArg()
96
+ : text_(NULL), size_(-1) {}
97
+
98
+ // Primitives
99
+ // We don't overload for signed and unsigned char because if people are
100
+ // explicitly declaring their chars as signed or unsigned then they are
101
+ // probably actually using them as 8-bit integers and would probably
102
+ // prefer an integer representation. But, we don't really know. So, we
103
+ // make the caller decide what to do.
104
+ inline SubstituteArg(char value)
105
+ : text_(scratch_), size_(1) { scratch_[0] = value; }
106
+ inline SubstituteArg(short value)
107
+ : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
108
+ inline SubstituteArg(unsigned short value)
109
+ : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
110
+ inline SubstituteArg(int value)
111
+ : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
112
+ inline SubstituteArg(unsigned int value)
113
+ : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {}
114
+ inline SubstituteArg(long value)
115
+ : text_(FastLongToBuffer(value, scratch_)), size_(strlen(text_)) {}
116
+ inline SubstituteArg(unsigned long value)
117
+ : text_(FastULongToBuffer(value, scratch_)), size_(strlen(text_)) {}
118
+ inline SubstituteArg(long long value)
119
+ : text_(FastInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {}
120
+ inline SubstituteArg(unsigned long long value)
121
+ : text_(FastUInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {}
122
+ inline SubstituteArg(float value)
123
+ : text_(FloatToBuffer(value, scratch_)), size_(strlen(text_)) {}
124
+ inline SubstituteArg(double value)
125
+ : text_(DoubleToBuffer(value, scratch_)), size_(strlen(text_)) {}
126
+ inline SubstituteArg(bool value)
127
+ : text_(value ? "true" : "false"), size_(strlen(text_)) {}
128
+
129
+ inline const char* data() const { return text_; }
130
+ inline int size() const { return size_; }
131
+
132
+ private:
133
+ const char* text_;
134
+ int size_;
135
+ char scratch_[kFastToBufferSize];
136
+ };
137
+
138
+ } // namespace internal
139
+
140
+ LIBPROTOBUF_EXPORT string Substitute(
141
+ const char* format,
142
+ const internal::SubstituteArg& arg0 = internal::SubstituteArg(),
143
+ const internal::SubstituteArg& arg1 = internal::SubstituteArg(),
144
+ const internal::SubstituteArg& arg2 = internal::SubstituteArg(),
145
+ const internal::SubstituteArg& arg3 = internal::SubstituteArg(),
146
+ const internal::SubstituteArg& arg4 = internal::SubstituteArg(),
147
+ const internal::SubstituteArg& arg5 = internal::SubstituteArg(),
148
+ const internal::SubstituteArg& arg6 = internal::SubstituteArg(),
149
+ const internal::SubstituteArg& arg7 = internal::SubstituteArg(),
150
+ const internal::SubstituteArg& arg8 = internal::SubstituteArg(),
151
+ const internal::SubstituteArg& arg9 = internal::SubstituteArg());
152
+
153
+ LIBPROTOBUF_EXPORT void SubstituteAndAppend(
154
+ string* output, const char* format,
155
+ const internal::SubstituteArg& arg0 = internal::SubstituteArg(),
156
+ const internal::SubstituteArg& arg1 = internal::SubstituteArg(),
157
+ const internal::SubstituteArg& arg2 = internal::SubstituteArg(),
158
+ const internal::SubstituteArg& arg3 = internal::SubstituteArg(),
159
+ const internal::SubstituteArg& arg4 = internal::SubstituteArg(),
160
+ const internal::SubstituteArg& arg5 = internal::SubstituteArg(),
161
+ const internal::SubstituteArg& arg6 = internal::SubstituteArg(),
162
+ const internal::SubstituteArg& arg7 = internal::SubstituteArg(),
163
+ const internal::SubstituteArg& arg8 = internal::SubstituteArg(),
164
+ const internal::SubstituteArg& arg9 = internal::SubstituteArg());
165
+
166
+ } // namespace strings
167
+ } // namespace protobuf
168
+ } // namespace google
169
+
170
+ #endif // GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_