rj_schema 0.2.4 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (627) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rj_schema/rapidjson/CHANGELOG.md +158 -0
  3. data/ext/rj_schema/rapidjson/CMakeLists.txt +248 -0
  4. data/ext/rj_schema/rapidjson/CMakeModules/FindGTestSrc.cmake +30 -0
  5. data/ext/rj_schema/rapidjson/RapidJSON.pc.in +7 -0
  6. data/ext/rj_schema/rapidjson/RapidJSONConfig.cmake.in +25 -0
  7. data/ext/rj_schema/rapidjson/RapidJSONConfigVersion.cmake.in +10 -0
  8. data/ext/rj_schema/rapidjson/appveyor.yml +102 -0
  9. data/ext/rj_schema/rapidjson/bin/data/abcde.txt +1 -0
  10. data/ext/rj_schema/rapidjson/bin/data/glossary.json +22 -0
  11. data/ext/rj_schema/rapidjson/bin/data/menu.json +27 -0
  12. data/ext/rj_schema/rapidjson/bin/data/readme.txt +1 -0
  13. data/ext/rj_schema/rapidjson/bin/data/sample.json +3315 -0
  14. data/ext/rj_schema/rapidjson/bin/data/webapp.json +88 -0
  15. data/ext/rj_schema/rapidjson/bin/data/widget.json +26 -0
  16. data/ext/rj_schema/rapidjson/bin/draft-04/schema +150 -0
  17. data/ext/rj_schema/rapidjson/bin/encodings/utf16be.json +0 -0
  18. data/ext/rj_schema/rapidjson/bin/encodings/utf16bebom.json +0 -0
  19. data/ext/rj_schema/rapidjson/bin/encodings/utf16le.json +0 -0
  20. data/ext/rj_schema/rapidjson/bin/encodings/utf16lebom.json +0 -0
  21. data/ext/rj_schema/rapidjson/bin/encodings/utf32be.json +0 -0
  22. data/ext/rj_schema/rapidjson/bin/encodings/utf32bebom.json +0 -0
  23. data/ext/rj_schema/rapidjson/bin/encodings/utf32le.json +0 -0
  24. data/ext/rj_schema/rapidjson/bin/encodings/utf32lebom.json +0 -0
  25. data/ext/rj_schema/rapidjson/bin/encodings/utf8.json +7 -0
  26. data/ext/rj_schema/rapidjson/bin/encodings/utf8bom.json +7 -0
  27. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail1.json +1 -0
  28. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail10.json +1 -0
  29. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail11.json +1 -0
  30. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail12.json +1 -0
  31. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail13.json +1 -0
  32. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail14.json +1 -0
  33. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail15.json +1 -0
  34. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail16.json +1 -0
  35. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail17.json +1 -0
  36. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail18.json +1 -0
  37. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail19.json +1 -0
  38. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail2.json +1 -0
  39. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail20.json +1 -0
  40. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail21.json +1 -0
  41. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail22.json +1 -0
  42. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail23.json +1 -0
  43. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail24.json +1 -0
  44. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail25.json +1 -0
  45. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail26.json +1 -0
  46. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail27.json +2 -0
  47. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail28.json +2 -0
  48. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail29.json +1 -0
  49. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail3.json +1 -0
  50. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail30.json +1 -0
  51. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail31.json +1 -0
  52. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail32.json +1 -0
  53. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail33.json +1 -0
  54. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail4.json +1 -0
  55. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail5.json +1 -0
  56. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail6.json +1 -0
  57. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail7.json +1 -0
  58. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail8.json +1 -0
  59. data/ext/rj_schema/rapidjson/bin/jsonchecker/fail9.json +1 -0
  60. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass1.json +58 -0
  61. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass2.json +1 -0
  62. data/ext/rj_schema/rapidjson/bin/jsonchecker/pass3.json +6 -0
  63. data/ext/rj_schema/rapidjson/bin/jsonchecker/readme.txt +3 -0
  64. data/ext/rj_schema/rapidjson/bin/jsonschema/LICENSE +19 -0
  65. data/ext/rj_schema/rapidjson/bin/jsonschema/README.md +148 -0
  66. data/ext/rj_schema/rapidjson/bin/jsonschema/bin/jsonschema_suite +283 -0
  67. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/folder/folderInteger.json +3 -0
  68. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/integer.json +3 -0
  69. data/ext/rj_schema/rapidjson/bin/jsonschema/remotes/subSchemas.json +8 -0
  70. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalItems.json +82 -0
  71. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/additionalProperties.json +88 -0
  72. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/default.json +49 -0
  73. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/dependencies.json +108 -0
  74. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/disallow.json +80 -0
  75. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/divisibleBy.json +60 -0
  76. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/enum.json +71 -0
  77. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/extends.json +94 -0
  78. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/items.json +46 -0
  79. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxItems.json +28 -0
  80. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maxLength.json +33 -0
  81. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/maximum.json +42 -0
  82. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minItems.json +28 -0
  83. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minLength.json +33 -0
  84. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/minimum.json +42 -0
  85. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/bignum.json +107 -0
  86. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/format.json +222 -0
  87. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/jsregex.json +18 -0
  88. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/optional/zeroTerminatedFloats.json +15 -0
  89. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/pattern.json +34 -0
  90. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/patternProperties.json +110 -0
  91. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/properties.json +92 -0
  92. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/ref.json +159 -0
  93. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/refRemote.json +74 -0
  94. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/required.json +53 -0
  95. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/type.json +474 -0
  96. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft3/uniqueItems.json +79 -0
  97. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalItems.json +82 -0
  98. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/additionalProperties.json +88 -0
  99. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/allOf.json +112 -0
  100. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/anyOf.json +68 -0
  101. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/default.json +49 -0
  102. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/definitions.json +32 -0
  103. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/dependencies.json +113 -0
  104. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/enum.json +72 -0
  105. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/items.json +46 -0
  106. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxItems.json +28 -0
  107. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxLength.json +33 -0
  108. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maxProperties.json +28 -0
  109. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/maximum.json +42 -0
  110. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minItems.json +28 -0
  111. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minLength.json +33 -0
  112. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minProperties.json +28 -0
  113. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/minimum.json +42 -0
  114. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/multipleOf.json +60 -0
  115. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/not.json +96 -0
  116. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/oneOf.json +68 -0
  117. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/bignum.json +107 -0
  118. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/format.json +148 -0
  119. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/optional/zeroTerminatedFloats.json +15 -0
  120. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/pattern.json +34 -0
  121. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/patternProperties.json +110 -0
  122. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/properties.json +92 -0
  123. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/ref.json +159 -0
  124. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/refRemote.json +74 -0
  125. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/required.json +39 -0
  126. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/type.json +330 -0
  127. data/ext/rj_schema/rapidjson/bin/jsonschema/tests/draft4/uniqueItems.json +79 -0
  128. data/ext/rj_schema/rapidjson/bin/jsonschema/tox.ini +8 -0
  129. data/ext/rj_schema/rapidjson/bin/types/alotofkeys.json +502 -0
  130. data/ext/rj_schema/rapidjson/bin/types/booleans.json +102 -0
  131. data/ext/rj_schema/rapidjson/bin/types/floats.json +102 -0
  132. data/ext/rj_schema/rapidjson/bin/types/guids.json +102 -0
  133. data/ext/rj_schema/rapidjson/bin/types/integers.json +102 -0
  134. data/ext/rj_schema/rapidjson/bin/types/mixed.json +592 -0
  135. data/ext/rj_schema/rapidjson/bin/types/nulls.json +102 -0
  136. data/ext/rj_schema/rapidjson/bin/types/paragraphs.json +102 -0
  137. data/ext/rj_schema/rapidjson/bin/types/readme.txt +1 -0
  138. data/ext/rj_schema/rapidjson/bin/unittestschema/address.json +139 -0
  139. data/ext/rj_schema/rapidjson/bin/unittestschema/allOf_address.json +7 -0
  140. data/ext/rj_schema/rapidjson/bin/unittestschema/anyOf_address.json +7 -0
  141. data/ext/rj_schema/rapidjson/bin/unittestschema/idandref.json +69 -0
  142. data/ext/rj_schema/rapidjson/bin/unittestschema/oneOf_address.json +7 -0
  143. data/ext/rj_schema/rapidjson/contrib/natvis/LICENSE +45 -0
  144. data/ext/rj_schema/rapidjson/contrib/natvis/README.md +7 -0
  145. data/ext/rj_schema/rapidjson/contrib/natvis/rapidjson.natvis +38 -0
  146. data/ext/rj_schema/rapidjson/doc/CMakeLists.txt +27 -0
  147. data/ext/rj_schema/rapidjson/doc/Doxyfile.in +2369 -0
  148. data/ext/rj_schema/rapidjson/doc/Doxyfile.zh-cn.in +2369 -0
  149. data/ext/rj_schema/rapidjson/doc/diagram/architecture.dot +50 -0
  150. data/ext/rj_schema/rapidjson/doc/diagram/architecture.png +0 -0
  151. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.dot +65 -0
  152. data/ext/rj_schema/rapidjson/doc/diagram/insituparsing.png +0 -0
  153. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.dot +62 -0
  154. data/ext/rj_schema/rapidjson/doc/diagram/iterative-parser-states-diagram.png +0 -0
  155. data/ext/rj_schema/rapidjson/doc/diagram/makefile +8 -0
  156. data/ext/rj_schema/rapidjson/doc/diagram/move1.dot +47 -0
  157. data/ext/rj_schema/rapidjson/doc/diagram/move1.png +0 -0
  158. data/ext/rj_schema/rapidjson/doc/diagram/move2.dot +62 -0
  159. data/ext/rj_schema/rapidjson/doc/diagram/move2.png +0 -0
  160. data/ext/rj_schema/rapidjson/doc/diagram/move3.dot +60 -0
  161. data/ext/rj_schema/rapidjson/doc/diagram/move3.png +0 -0
  162. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.dot +56 -0
  163. data/ext/rj_schema/rapidjson/doc/diagram/normalparsing.png +0 -0
  164. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.dot +54 -0
  165. data/ext/rj_schema/rapidjson/doc/diagram/simpledom.png +0 -0
  166. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.dot +58 -0
  167. data/ext/rj_schema/rapidjson/doc/diagram/tutorial.png +0 -0
  168. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.dot +73 -0
  169. data/ext/rj_schema/rapidjson/doc/diagram/utilityclass.png +0 -0
  170. data/ext/rj_schema/rapidjson/doc/dom.md +281 -0
  171. data/ext/rj_schema/rapidjson/doc/dom.zh-cn.md +285 -0
  172. data/ext/rj_schema/rapidjson/doc/encoding.md +146 -0
  173. data/ext/rj_schema/rapidjson/doc/encoding.zh-cn.md +152 -0
  174. data/ext/rj_schema/rapidjson/doc/faq.md +289 -0
  175. data/ext/rj_schema/rapidjson/doc/faq.zh-cn.md +290 -0
  176. data/ext/rj_schema/rapidjson/doc/features.md +104 -0
  177. data/ext/rj_schema/rapidjson/doc/features.zh-cn.md +103 -0
  178. data/ext/rj_schema/rapidjson/doc/internals.md +368 -0
  179. data/ext/rj_schema/rapidjson/doc/internals.zh-cn.md +363 -0
  180. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.png +0 -0
  181. data/ext/rj_schema/rapidjson/doc/logo/rapidjson.svg +119 -0
  182. data/ext/rj_schema/rapidjson/doc/misc/DoxygenLayout.xml +194 -0
  183. data/ext/rj_schema/rapidjson/doc/misc/doxygenextra.css +274 -0
  184. data/ext/rj_schema/rapidjson/doc/misc/footer.html +11 -0
  185. data/ext/rj_schema/rapidjson/doc/misc/header.html +24 -0
  186. data/ext/rj_schema/rapidjson/doc/npm.md +31 -0
  187. data/ext/rj_schema/rapidjson/doc/performance.md +26 -0
  188. data/ext/rj_schema/rapidjson/doc/performance.zh-cn.md +26 -0
  189. data/ext/rj_schema/rapidjson/doc/pointer.md +234 -0
  190. data/ext/rj_schema/rapidjson/doc/pointer.zh-cn.md +234 -0
  191. data/ext/rj_schema/rapidjson/doc/sax.md +509 -0
  192. data/ext/rj_schema/rapidjson/doc/sax.zh-cn.md +487 -0
  193. data/ext/rj_schema/rapidjson/doc/schema.md +505 -0
  194. data/ext/rj_schema/rapidjson/doc/schema.zh-cn.md +237 -0
  195. data/ext/rj_schema/rapidjson/doc/stream.md +429 -0
  196. data/ext/rj_schema/rapidjson/doc/stream.zh-cn.md +429 -0
  197. data/ext/rj_schema/rapidjson/doc/tutorial.md +536 -0
  198. data/ext/rj_schema/rapidjson/doc/tutorial.zh-cn.md +535 -0
  199. data/ext/rj_schema/rapidjson/docker/debian/Dockerfile +8 -0
  200. data/ext/rj_schema/rapidjson/example/CMakeLists.txt +46 -0
  201. data/ext/rj_schema/rapidjson/example/archiver/archiver.cpp +292 -0
  202. data/ext/rj_schema/rapidjson/example/archiver/archiver.h +145 -0
  203. data/ext/rj_schema/rapidjson/example/archiver/archivertest.cpp +287 -0
  204. data/ext/rj_schema/rapidjson/example/capitalize/capitalize.cpp +67 -0
  205. data/ext/rj_schema/rapidjson/example/condense/condense.cpp +32 -0
  206. data/ext/rj_schema/rapidjson/example/filterkey/filterkey.cpp +135 -0
  207. data/ext/rj_schema/rapidjson/example/filterkeydom/filterkeydom.cpp +170 -0
  208. data/ext/rj_schema/rapidjson/example/jsonx/jsonx.cpp +207 -0
  209. data/ext/rj_schema/rapidjson/example/lookaheadparser/lookaheadparser.cpp +350 -0
  210. data/ext/rj_schema/rapidjson/example/messagereader/messagereader.cpp +105 -0
  211. data/ext/rj_schema/rapidjson/example/parsebyparts/parsebyparts.cpp +176 -0
  212. data/ext/rj_schema/rapidjson/example/pretty/pretty.cpp +30 -0
  213. data/ext/rj_schema/rapidjson/example/prettyauto/prettyauto.cpp +56 -0
  214. data/ext/rj_schema/rapidjson/example/schemavalidator/schemavalidator.cpp +198 -0
  215. data/ext/rj_schema/rapidjson/example/serialize/serialize.cpp +173 -0
  216. data/ext/rj_schema/rapidjson/example/simpledom/simpledom.cpp +29 -0
  217. data/ext/rj_schema/rapidjson/example/simplepullreader/simplepullreader.cpp +53 -0
  218. data/ext/rj_schema/rapidjson/example/simplereader/simplereader.cpp +42 -0
  219. data/ext/rj_schema/rapidjson/example/simplewriter/simplewriter.cpp +36 -0
  220. data/ext/rj_schema/rapidjson/example/sortkeys/sortkeys.cpp +62 -0
  221. data/ext/rj_schema/rapidjson/example/traverseaspointer.cpp +39 -0
  222. data/ext/rj_schema/rapidjson/example/tutorial/tutorial.cpp +151 -0
  223. data/ext/rj_schema/rapidjson/include/rapidjson/allocators.h +692 -0
  224. data/ext/rj_schema/rapidjson/include/rapidjson/cursorstreamwrapper.h +78 -0
  225. data/ext/rj_schema/rapidjson/include/rapidjson/document.h +3027 -0
  226. data/ext/rj_schema/rapidjson/include/rapidjson/encodedstream.h +299 -0
  227. data/ext/rj_schema/rapidjson/include/rapidjson/encodings.h +716 -0
  228. data/ext/rj_schema/rapidjson/include/rapidjson/error/en.h +122 -0
  229. data/ext/rj_schema/rapidjson/include/rapidjson/error/error.h +216 -0
  230. data/ext/rj_schema/rapidjson/include/rapidjson/filereadstream.h +99 -0
  231. data/ext/rj_schema/rapidjson/include/rapidjson/filewritestream.h +104 -0
  232. data/ext/rj_schema/rapidjson/include/rapidjson/fwd.h +151 -0
  233. data/ext/rj_schema/rapidjson/include/rapidjson/internal/biginteger.h +290 -0
  234. data/ext/rj_schema/rapidjson/include/rapidjson/internal/clzll.h +71 -0
  235. data/ext/rj_schema/rapidjson/include/rapidjson/internal/diyfp.h +257 -0
  236. data/ext/rj_schema/rapidjson/include/rapidjson/internal/dtoa.h +245 -0
  237. data/ext/rj_schema/rapidjson/include/rapidjson/internal/ieee754.h +78 -0
  238. data/ext/rj_schema/rapidjson/include/rapidjson/internal/itoa.h +308 -0
  239. data/ext/rj_schema/rapidjson/include/rapidjson/internal/meta.h +186 -0
  240. data/ext/rj_schema/rapidjson/include/rapidjson/internal/pow10.h +55 -0
  241. data/ext/rj_schema/rapidjson/include/rapidjson/internal/regex.h +739 -0
  242. data/ext/rj_schema/rapidjson/include/rapidjson/internal/stack.h +232 -0
  243. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strfunc.h +83 -0
  244. data/ext/rj_schema/rapidjson/include/rapidjson/internal/strtod.h +290 -0
  245. data/ext/rj_schema/rapidjson/include/rapidjson/internal/swap.h +46 -0
  246. data/ext/rj_schema/rapidjson/include/rapidjson/istreamwrapper.h +128 -0
  247. data/ext/rj_schema/rapidjson/include/rapidjson/memorybuffer.h +70 -0
  248. data/ext/rj_schema/rapidjson/include/rapidjson/memorystream.h +71 -0
  249. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/inttypes.h +316 -0
  250. data/ext/rj_schema/rapidjson/include/rapidjson/msinttypes/stdint.h +300 -0
  251. data/ext/rj_schema/rapidjson/include/rapidjson/ostreamwrapper.h +81 -0
  252. data/ext/rj_schema/rapidjson/include/rapidjson/pointer.h +1482 -0
  253. data/ext/rj_schema/rapidjson/include/rapidjson/prettywriter.h +277 -0
  254. data/ext/rj_schema/rapidjson/include/rapidjson/rapidjson.h +741 -0
  255. data/ext/rj_schema/rapidjson/include/rapidjson/reader.h +2244 -0
  256. data/ext/rj_schema/rapidjson/include/rapidjson/schema.h +2795 -0
  257. data/ext/rj_schema/rapidjson/include/rapidjson/stream.h +223 -0
  258. data/ext/rj_schema/rapidjson/include/rapidjson/stringbuffer.h +121 -0
  259. data/ext/rj_schema/rapidjson/include/rapidjson/uri.h +466 -0
  260. data/ext/rj_schema/rapidjson/include/rapidjson/writer.h +710 -0
  261. data/ext/rj_schema/rapidjson/include_dirs.js +2 -0
  262. data/ext/rj_schema/rapidjson/library.json +15 -0
  263. data/ext/rj_schema/rapidjson/license.txt +57 -0
  264. data/ext/rj_schema/rapidjson/package.json +24 -0
  265. data/ext/rj_schema/rapidjson/rapidjson.autopkg +77 -0
  266. data/ext/rj_schema/rapidjson/readme.md +210 -0
  267. data/ext/rj_schema/rapidjson/readme.zh-cn.md +152 -0
  268. data/ext/rj_schema/rapidjson/test/CMakeLists.txt +20 -0
  269. data/ext/rj_schema/rapidjson/test/perftest/CMakeLists.txt +28 -0
  270. data/ext/rj_schema/rapidjson/test/perftest/misctest.cpp +974 -0
  271. data/ext/rj_schema/rapidjson/test/perftest/perftest.cpp +24 -0
  272. data/ext/rj_schema/rapidjson/test/perftest/perftest.h +186 -0
  273. data/ext/rj_schema/rapidjson/test/perftest/platformtest.cpp +166 -0
  274. data/ext/rj_schema/rapidjson/test/perftest/rapidjsontest.cpp +564 -0
  275. data/ext/rj_schema/rapidjson/test/perftest/schematest.cpp +223 -0
  276. data/ext/rj_schema/rapidjson/test/unittest/CMakeLists.txt +95 -0
  277. data/ext/rj_schema/rapidjson/test/unittest/allocatorstest.cpp +292 -0
  278. data/ext/rj_schema/rapidjson/test/unittest/bigintegertest.cpp +138 -0
  279. data/ext/rj_schema/rapidjson/test/unittest/clzlltest.cpp +34 -0
  280. data/ext/rj_schema/rapidjson/test/unittest/cursorstreamwrappertest.cpp +115 -0
  281. data/ext/rj_schema/rapidjson/test/unittest/documenttest.cpp +674 -0
  282. data/ext/rj_schema/rapidjson/test/unittest/dtoatest.cpp +98 -0
  283. data/ext/rj_schema/rapidjson/test/unittest/encodedstreamtest.cpp +313 -0
  284. data/ext/rj_schema/rapidjson/test/unittest/encodingstest.cpp +451 -0
  285. data/ext/rj_schema/rapidjson/test/unittest/filestreamtest.cpp +155 -0
  286. data/ext/rj_schema/rapidjson/test/unittest/fwdtest.cpp +230 -0
  287. data/ext/rj_schema/rapidjson/test/unittest/istreamwrappertest.cpp +181 -0
  288. data/ext/rj_schema/rapidjson/test/unittest/itoatest.cpp +160 -0
  289. data/ext/rj_schema/rapidjson/test/unittest/jsoncheckertest.cpp +143 -0
  290. data/ext/rj_schema/rapidjson/test/unittest/namespacetest.cpp +70 -0
  291. data/ext/rj_schema/rapidjson/test/unittest/ostreamwrappertest.cpp +92 -0
  292. data/ext/rj_schema/rapidjson/test/unittest/platformtest.cpp +40 -0
  293. data/ext/rj_schema/rapidjson/test/unittest/pointertest.cpp +1730 -0
  294. data/ext/rj_schema/rapidjson/test/unittest/prettywritertest.cpp +373 -0
  295. data/ext/rj_schema/rapidjson/test/unittest/readertest.cpp +2228 -0
  296. data/ext/rj_schema/rapidjson/test/unittest/regextest.cpp +639 -0
  297. data/ext/rj_schema/rapidjson/test/unittest/schematest.cpp +2952 -0
  298. data/ext/rj_schema/rapidjson/test/unittest/simdtest.cpp +219 -0
  299. data/ext/rj_schema/rapidjson/test/unittest/strfunctest.cpp +30 -0
  300. data/ext/rj_schema/rapidjson/test/unittest/stringbuffertest.cpp +192 -0
  301. data/ext/rj_schema/rapidjson/test/unittest/strtodtest.cpp +132 -0
  302. data/ext/rj_schema/rapidjson/test/unittest/unittest.cpp +51 -0
  303. data/ext/rj_schema/rapidjson/test/unittest/unittest.h +143 -0
  304. data/ext/rj_schema/rapidjson/test/unittest/uritest.cpp +718 -0
  305. data/ext/rj_schema/rapidjson/test/unittest/valuetest.cpp +1861 -0
  306. data/ext/rj_schema/rapidjson/test/unittest/writertest.cpp +598 -0
  307. data/ext/rj_schema/rapidjson/test/valgrind.supp +17 -0
  308. data/ext/rj_schema/rapidjson/thirdparty/gtest/BUILD.bazel +175 -0
  309. data/ext/rj_schema/rapidjson/thirdparty/gtest/CMakeLists.txt +33 -0
  310. data/ext/rj_schema/rapidjson/thirdparty/gtest/CONTRIBUTING.md +160 -0
  311. data/ext/rj_schema/rapidjson/thirdparty/gtest/LICENSE +28 -0
  312. data/ext/rj_schema/rapidjson/thirdparty/gtest/Makefile.am +14 -0
  313. data/ext/rj_schema/rapidjson/thirdparty/gtest/README.md +122 -0
  314. data/ext/rj_schema/rapidjson/thirdparty/gtest/WORKSPACE +8 -0
  315. data/ext/rj_schema/rapidjson/thirdparty/gtest/appveyor.yml +104 -0
  316. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/build-linux-autotools.sh +44 -0
  317. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/build-linux-bazel.sh +36 -0
  318. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/env-linux.sh +41 -0
  319. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/env-osx.sh +40 -0
  320. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/get-nprocessors.sh +48 -0
  321. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/install-linux.sh +49 -0
  322. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/install-osx.sh +39 -0
  323. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/log-config.sh +51 -0
  324. data/ext/rj_schema/rapidjson/thirdparty/gtest/ci/travis.sh +44 -0
  325. data/ext/rj_schema/rapidjson/thirdparty/gtest/configure.ac +16 -0
  326. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CHANGES +126 -0
  327. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CMakeLists.txt +242 -0
  328. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CONTRIBUTORS +40 -0
  329. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/LICENSE +28 -0
  330. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/Makefile.am +224 -0
  331. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/README.md +344 -0
  332. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/cmake/gmock.pc.in +9 -0
  333. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/cmake/gmock_main.pc.in +9 -0
  334. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/configure.ac +146 -0
  335. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CheatSheet.md +564 -0
  336. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CookBook.md +3660 -0
  337. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DesignDoc.md +280 -0
  338. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/Documentation.md +15 -0
  339. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/ForDummies.md +447 -0
  340. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/FrequentlyAskedQuestions.md +627 -0
  341. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/KnownIssues.md +19 -0
  342. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-actions.h +1262 -0
  343. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-cardinalities.h +147 -0
  344. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h +2571 -0
  345. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump +833 -0
  346. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h +1379 -0
  347. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +347 -0
  348. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h +2258 -0
  349. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump +675 -0
  350. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h +458 -0
  351. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +178 -0
  352. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-matchers.h +5255 -0
  353. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-actions.h +246 -0
  354. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-matchers.h +91 -0
  355. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-spec-builders.h +1918 -0
  356. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock.h +95 -0
  357. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +8 -0
  358. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +10 -0
  359. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-matchers.h +38 -0
  360. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-port.h +46 -0
  361. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h +286 -0
  362. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump +136 -0
  363. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-internal-utils.h +574 -0
  364. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-port.h +87 -0
  365. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/make/Makefile +101 -0
  366. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.sln +32 -0
  367. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.vcproj +191 -0
  368. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_config.vsprops +15 -0
  369. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_main.vcproj +187 -0
  370. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_test.vcproj +201 -0
  371. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.sln +46 -0
  372. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.vcxproj +145 -0
  373. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_config.props +19 -0
  374. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_main.vcxproj +151 -0
  375. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_test.vcxproj +176 -0
  376. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.sln +46 -0
  377. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.vcxproj +145 -0
  378. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_config.props +19 -0
  379. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_main.vcxproj +151 -0
  380. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_test.vcxproj +176 -0
  381. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/fuse_gmock_files.py +240 -0
  382. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/LICENSE +203 -0
  383. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README +34 -0
  384. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README.cppclean +115 -0
  385. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  386. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/ast.py +1733 -0
  387. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class.py +227 -0
  388. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class_test.py +448 -0
  389. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/keywords.py +59 -0
  390. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/tokenize.py +287 -0
  391. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/utils.py +41 -0
  392. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/gmock_gen.py +31 -0
  393. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock-config.in +303 -0
  394. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock_doctor.py +640 -0
  395. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload.py +1387 -0
  396. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload_gmock.py +78 -0
  397. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-all.cc +47 -0
  398. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-cardinalities.cc +156 -0
  399. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-internal-utils.cc +204 -0
  400. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-matchers.cc +573 -0
  401. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-spec-builders.cc +883 -0
  402. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock.cc +205 -0
  403. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock_main.cc +54 -0
  404. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/BUILD.bazel +123 -0
  405. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-actions_test.cc +1575 -0
  406. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-cardinalities_test.cc +428 -0
  407. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-actions_test.cc +1230 -0
  408. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-function-mockers_test.cc +647 -0
  409. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-internal-utils_test.cc +129 -0
  410. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-matchers_test.cc +1341 -0
  411. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-internal-utils_test.cc +718 -0
  412. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-matchers_test.cc +6767 -0
  413. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-more-actions_test.cc +710 -0
  414. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-nice-strict_test.cc +511 -0
  415. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-port_test.cc +43 -0
  416. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-spec-builders_test.cc +2771 -0
  417. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_all_test.cc +51 -0
  418. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_ex_test.cc +81 -0
  419. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test.py +108 -0
  420. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test_.cc +100 -0
  421. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link2_test.cc +40 -0
  422. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.cc +40 -0
  423. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.h +691 -0
  424. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test.py +183 -0
  425. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_.cc +310 -0
  426. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_golden.txt +317 -0
  427. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_stress_test.cc +323 -0
  428. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test.cc +262 -0
  429. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test_utils.py +110 -0
  430. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CHANGES +157 -0
  431. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CMakeLists.txt +312 -0
  432. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CONTRIBUTORS +37 -0
  433. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/LICENSE +28 -0
  434. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/Makefile.am +339 -0
  435. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/README.md +341 -0
  436. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/gtest.pc.in +9 -0
  437. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/gtest_main.pc.in +10 -0
  438. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/internal_utils.cmake +280 -0
  439. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.cbproj +138 -0
  440. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.groupproj +54 -0
  441. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_all.cc +38 -0
  442. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_link.cc +40 -0
  443. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_main.cbproj +82 -0
  444. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_unittest.cbproj +88 -0
  445. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/configure.ac +68 -0
  446. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Pkgconfig.md +146 -0
  447. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/PumpManual.md +177 -0
  448. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/XcodeGuide.md +93 -0
  449. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/advanced.md +2416 -0
  450. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/faq.md +1092 -0
  451. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/primer.md +536 -0
  452. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/samples.md +14 -0
  453. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-death-test.h +342 -0
  454. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-message.h +249 -0
  455. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h +1438 -0
  456. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h.pump +501 -0
  457. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-printers.h +1082 -0
  458. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-spi.h +231 -0
  459. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-test-part.h +179 -0
  460. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-typed-test.h +264 -0
  461. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest.h +2332 -0
  462. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_pred_impl.h +357 -0
  463. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_prod.h +61 -0
  464. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-port.h +70 -0
  465. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  466. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest.h +45 -0
  467. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-death-test-internal.h +275 -0
  468. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-filepath.h +205 -0
  469. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-internal.h +1277 -0
  470. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  471. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h +5139 -0
  472. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +279 -0
  473. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util.h +723 -0
  474. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port-arch.h +100 -0
  475. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port.h +2687 -0
  476. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-string.h +167 -0
  477. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  478. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  479. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h +3347 -0
  480. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h.pump +313 -0
  481. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/acx_pthread.m4 +363 -0
  482. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/gtest.m4 +74 -0
  483. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/make/Makefile +82 -0
  484. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.sln +55 -0
  485. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.vcxproj +149 -0
  486. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest-md.vcxproj.filters +18 -0
  487. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.sln +55 -0
  488. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.vcxproj +149 -0
  489. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest.vcxproj.filters +18 -0
  490. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main-md.vcxproj +154 -0
  491. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main-md.vcxproj.filters +18 -0
  492. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main.vcxproj +162 -0
  493. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_main.vcxproj.filters +18 -0
  494. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test-md.vcxproj +199 -0
  495. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test-md.vcxproj.filters +26 -0
  496. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test.vcxproj +191 -0
  497. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_prod_test.vcxproj.filters +26 -0
  498. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest-md.vcxproj +188 -0
  499. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest-md.vcxproj.filters +18 -0
  500. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest.vcxproj +180 -0
  501. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/2010/gtest_unittest.vcxproj.filters +18 -0
  502. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/prime_tables.h +127 -0
  503. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.cc +68 -0
  504. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.h +43 -0
  505. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample10_unittest.cc +140 -0
  506. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1_unittest.cc +154 -0
  507. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.cc +56 -0
  508. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.h +85 -0
  509. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2_unittest.cc +110 -0
  510. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3-inl.h +172 -0
  511. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3_unittest.cc +152 -0
  512. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.cc +46 -0
  513. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.h +53 -0
  514. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4_unittest.cc +49 -0
  515. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample5_unittest.cc +199 -0
  516. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample6_unittest.cc +225 -0
  517. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample7_unittest.cc +118 -0
  518. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample8_unittest.cc +174 -0
  519. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample9_unittest.cc +157 -0
  520. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/common.py +83 -0
  521. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/fuse_gtest_files.py +253 -0
  522. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gen_gtest_pred_impl.py +730 -0
  523. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gtest-config.in +274 -0
  524. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/pump.py +855 -0
  525. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/release_docs.py +158 -0
  526. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/test/Makefile +59 -0
  527. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload.py +1387 -0
  528. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload_gtest.py +78 -0
  529. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-all.cc +48 -0
  530. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-death-test.cc +1536 -0
  531. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-filepath.cc +385 -0
  532. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-internal-inl.h +1175 -0
  533. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-port.cc +1277 -0
  534. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-printers.cc +458 -0
  535. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-test-part.cc +102 -0
  536. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-typed-test.cc +119 -0
  537. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest.cc +5846 -0
  538. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest_main.cc +38 -0
  539. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/BUILD.bazel +396 -0
  540. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_ex_test.cc +93 -0
  541. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_test.cc +1424 -0
  542. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-filepath_test.cc +652 -0
  543. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-linked_ptr_test.cc +154 -0
  544. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-listener_test.cc +311 -0
  545. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-message_test.cc +159 -0
  546. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-options_test.cc +213 -0
  547. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test2_test.cc +61 -0
  548. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.cc +1110 -0
  549. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.h +53 -0
  550. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-port_test.cc +1303 -0
  551. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-printers_test.cc +1737 -0
  552. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-test-part_test.cc +208 -0
  553. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-tuple_test.cc +320 -0
  554. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test2_test.cc +45 -0
  555. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.cc +380 -0
  556. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.h +66 -0
  557. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-unittest-api_test.cc +341 -0
  558. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_all_test.cc +47 -0
  559. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_assert_by_exception_test.cc +119 -0
  560. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest.py +210 -0
  561. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest_.cc +87 -0
  562. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test.py +235 -0
  563. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test_.cc +311 -0
  564. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test.py +129 -0
  565. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test_.cc +63 -0
  566. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test.py +119 -0
  567. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test_.cc +124 -0
  568. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_environment_test.cc +189 -0
  569. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest.py +638 -0
  570. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest_.cc +138 -0
  571. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test.py +172 -0
  572. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test_.cc +46 -0
  573. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_outfiles_test.py +162 -0
  574. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_output_unittest.py +611 -0
  575. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_json_test_utils.py +60 -0
  576. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest.py +207 -0
  577. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest_.cc +157 -0
  578. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_main_unittest.cc +45 -0
  579. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_no_test_unittest.cc +56 -0
  580. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test.py +344 -0
  581. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_.cc +1067 -0
  582. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_golden_lin.txt +781 -0
  583. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_pred_impl_unittest.cc +2427 -0
  584. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_premature_exit_test.cc +127 -0
  585. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_prod_test.cc +57 -0
  586. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_repeat_test.cc +236 -0
  587. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test.py +325 -0
  588. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test_.cc +103 -0
  589. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_sole_header_test.cc +57 -0
  590. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_stress_test.cc +250 -0
  591. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_test_utils.py +318 -0
  592. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_testbridge_test.py +65 -0
  593. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_testbridge_test_.cc +44 -0
  594. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_ex_test.cc +92 -0
  595. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test.py +171 -0
  596. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test_.cc +72 -0
  597. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test.py +69 -0
  598. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test_.cc +43 -0
  599. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_unittest.cc +7797 -0
  600. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile1_test_.cc +48 -0
  601. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile2_test_.cc +48 -0
  602. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfiles_test.py +140 -0
  603. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest.py +378 -0
  604. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest_.cc +179 -0
  605. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_test_utils.py +196 -0
  606. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.cc +36 -0
  607. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.h +55 -0
  608. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/DebugProject.xcconfig +30 -0
  609. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/FrameworkTarget.xcconfig +17 -0
  610. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/General.xcconfig +41 -0
  611. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/ReleaseProject.xcconfig +32 -0
  612. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/StaticLibraryTarget.xcconfig +18 -0
  613. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/TestTarget.xcconfig +8 -0
  614. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Resources/Info.plist +30 -0
  615. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/Info.plist +28 -0
  616. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj +457 -0
  617. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/runtests.sh +62 -0
  618. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.cc +63 -0
  619. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.h +59 -0
  620. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget_test.cc +68 -0
  621. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/runtests.sh +65 -0
  622. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/versiongenerate.py +100 -0
  623. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/gtest.xcodeproj/project.pbxproj +1182 -0
  624. data/ext/rj_schema/rapidjson/travis-doxygen.sh +128 -0
  625. data/ext/rj_schema/rj_schema.cpp +162 -18
  626. data/lib/rj_schema.rb +1 -1
  627. metadata +626 -3
@@ -0,0 +1,78 @@
1
+ // Tencent is pleased to support the open source community by making RapidJSON available.
2
+ //
3
+ // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
4
+ //
5
+ // Licensed under the MIT License (the "License"); you may not use this file except
6
+ // in compliance with the License. You may obtain a copy of the License at
7
+ //
8
+ // http://opensource.org/licenses/MIT
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software distributed
11
+ // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ // specific language governing permissions and limitations under the License.
14
+
15
+ #ifndef RAPIDJSON_CURSORSTREAMWRAPPER_H_
16
+ #define RAPIDJSON_CURSORSTREAMWRAPPER_H_
17
+
18
+ #include "stream.h"
19
+
20
+ #if defined(__GNUC__)
21
+ RAPIDJSON_DIAG_PUSH
22
+ RAPIDJSON_DIAG_OFF(effc++)
23
+ #endif
24
+
25
+ #if defined(_MSC_VER) && _MSC_VER <= 1800
26
+ RAPIDJSON_DIAG_PUSH
27
+ RAPIDJSON_DIAG_OFF(4702) // unreachable code
28
+ RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated
29
+ #endif
30
+
31
+ RAPIDJSON_NAMESPACE_BEGIN
32
+
33
+
34
+ //! Cursor stream wrapper for counting line and column number if error exists.
35
+ /*!
36
+ \tparam InputStream Any stream that implements Stream Concept
37
+ */
38
+ template <typename InputStream, typename Encoding = UTF8<> >
39
+ class CursorStreamWrapper : public GenericStreamWrapper<InputStream, Encoding> {
40
+ public:
41
+ typedef typename Encoding::Ch Ch;
42
+
43
+ CursorStreamWrapper(InputStream& is):
44
+ GenericStreamWrapper<InputStream, Encoding>(is), line_(1), col_(0) {}
45
+
46
+ // counting line and column number
47
+ Ch Take() {
48
+ Ch ch = this->is_.Take();
49
+ if(ch == '\n') {
50
+ line_ ++;
51
+ col_ = 0;
52
+ } else {
53
+ col_ ++;
54
+ }
55
+ return ch;
56
+ }
57
+
58
+ //! Get the error line number, if error exists.
59
+ size_t GetLine() const { return line_; }
60
+ //! Get the error column number, if error exists.
61
+ size_t GetColumn() const { return col_; }
62
+
63
+ private:
64
+ size_t line_; //!< Current Line
65
+ size_t col_; //!< Current Column
66
+ };
67
+
68
+ #if defined(_MSC_VER) && _MSC_VER <= 1800
69
+ RAPIDJSON_DIAG_POP
70
+ #endif
71
+
72
+ #if defined(__GNUC__)
73
+ RAPIDJSON_DIAG_POP
74
+ #endif
75
+
76
+ RAPIDJSON_NAMESPACE_END
77
+
78
+ #endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_
@@ -0,0 +1,3027 @@
1
+ // Tencent is pleased to support the open source community by making RapidJSON available.
2
+ //
3
+ // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
4
+ //
5
+ // Licensed under the MIT License (the "License"); you may not use this file except
6
+ // in compliance with the License. You may obtain a copy of the License at
7
+ //
8
+ // http://opensource.org/licenses/MIT
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software distributed
11
+ // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12
+ // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13
+ // specific language governing permissions and limitations under the License.
14
+
15
+ #ifndef RAPIDJSON_DOCUMENT_H_
16
+ #define RAPIDJSON_DOCUMENT_H_
17
+
18
+ /*! \file document.h */
19
+
20
+ #include "reader.h"
21
+ #include "internal/meta.h"
22
+ #include "internal/strfunc.h"
23
+ #include "memorystream.h"
24
+ #include "encodedstream.h"
25
+ #include <new> // placement new
26
+ #include <limits>
27
+ #ifdef __cpp_lib_three_way_comparison
28
+ #include <compare>
29
+ #endif
30
+
31
+ RAPIDJSON_DIAG_PUSH
32
+ #ifdef __clang__
33
+ RAPIDJSON_DIAG_OFF(padded)
34
+ RAPIDJSON_DIAG_OFF(switch-enum)
35
+ RAPIDJSON_DIAG_OFF(c++98-compat)
36
+ #elif defined(_MSC_VER)
37
+ RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
38
+ RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data
39
+ #endif
40
+
41
+ #ifdef __GNUC__
42
+ RAPIDJSON_DIAG_OFF(effc++)
43
+ #endif // __GNUC__
44
+
45
+ #ifdef GetObject
46
+ // see https://github.com/Tencent/rapidjson/issues/1448
47
+ // a former included windows.h might have defined a macro called GetObject, which affects
48
+ // GetObject defined here. This ensures the macro does not get applied
49
+ #pragma push_macro("GetObject")
50
+ #define RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED
51
+ #undef GetObject
52
+ #endif
53
+
54
+ #ifndef RAPIDJSON_NOMEMBERITERATORCLASS
55
+ #include <iterator> // std::random_access_iterator_tag
56
+ #endif
57
+
58
+ #if RAPIDJSON_USE_MEMBERSMAP
59
+ #include <map> // std::multimap
60
+ #endif
61
+
62
+ RAPIDJSON_NAMESPACE_BEGIN
63
+
64
+ // Forward declaration.
65
+ template <typename Encoding, typename Allocator>
66
+ class GenericValue;
67
+
68
+ template <typename Encoding, typename Allocator, typename StackAllocator>
69
+ class GenericDocument;
70
+
71
+ /*! \def RAPIDJSON_DEFAULT_ALLOCATOR
72
+ \ingroup RAPIDJSON_CONFIG
73
+ \brief Allows to choose default allocator.
74
+
75
+ User can define this to use CrtAllocator or MemoryPoolAllocator.
76
+ */
77
+ #ifndef RAPIDJSON_DEFAULT_ALLOCATOR
78
+ #define RAPIDJSON_DEFAULT_ALLOCATOR MemoryPoolAllocator<CrtAllocator>
79
+ #endif
80
+
81
+ /*! \def RAPIDJSON_DEFAULT_STACK_ALLOCATOR
82
+ \ingroup RAPIDJSON_CONFIG
83
+ \brief Allows to choose default stack allocator for Document.
84
+
85
+ User can define this to use CrtAllocator or MemoryPoolAllocator.
86
+ */
87
+ #ifndef RAPIDJSON_DEFAULT_STACK_ALLOCATOR
88
+ #define RAPIDJSON_DEFAULT_STACK_ALLOCATOR CrtAllocator
89
+ #endif
90
+
91
+ /*! \def RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY
92
+ \ingroup RAPIDJSON_CONFIG
93
+ \brief User defined kDefaultObjectCapacity value.
94
+
95
+ User can define this as any natural number.
96
+ */
97
+ #ifndef RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY
98
+ // number of objects that rapidjson::Value allocates memory for by default
99
+ #define RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY 16
100
+ #endif
101
+
102
+ /*! \def RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY
103
+ \ingroup RAPIDJSON_CONFIG
104
+ \brief User defined kDefaultArrayCapacity value.
105
+
106
+ User can define this as any natural number.
107
+ */
108
+ #ifndef RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY
109
+ // number of array elements that rapidjson::Value allocates memory for by default
110
+ #define RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY 16
111
+ #endif
112
+
113
+ //! Name-value pair in a JSON object value.
114
+ /*!
115
+ This class was internal to GenericValue. It used to be a inner struct.
116
+ But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct.
117
+ https://code.google.com/p/rapidjson/issues/detail?id=64
118
+ */
119
+ template <typename Encoding, typename Allocator>
120
+ class GenericMember {
121
+ public:
122
+ GenericValue<Encoding, Allocator> name; //!< name of member (must be a string)
123
+ GenericValue<Encoding, Allocator> value; //!< value of member.
124
+
125
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
126
+ //! Move constructor in C++11
127
+ GenericMember(GenericMember&& rhs) RAPIDJSON_NOEXCEPT
128
+ : name(std::move(rhs.name)),
129
+ value(std::move(rhs.value))
130
+ {
131
+ }
132
+
133
+ //! Move assignment in C++11
134
+ GenericMember& operator=(GenericMember&& rhs) RAPIDJSON_NOEXCEPT {
135
+ return *this = static_cast<GenericMember&>(rhs);
136
+ }
137
+ #endif
138
+
139
+ //! Assignment with move semantics.
140
+ /*! \param rhs Source of the assignment. Its name and value will become a null value after assignment.
141
+ */
142
+ GenericMember& operator=(GenericMember& rhs) RAPIDJSON_NOEXCEPT {
143
+ if (RAPIDJSON_LIKELY(this != &rhs)) {
144
+ name = rhs.name;
145
+ value = rhs.value;
146
+ }
147
+ return *this;
148
+ }
149
+
150
+ // swap() for std::sort() and other potential use in STL.
151
+ friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT {
152
+ a.name.Swap(b.name);
153
+ a.value.Swap(b.value);
154
+ }
155
+
156
+ private:
157
+ //! Copy constructor is not permitted.
158
+ GenericMember(const GenericMember& rhs);
159
+ };
160
+
161
+ ///////////////////////////////////////////////////////////////////////////////
162
+ // GenericMemberIterator
163
+
164
+ #ifndef RAPIDJSON_NOMEMBERITERATORCLASS
165
+
166
+ //! (Constant) member iterator for a JSON object value
167
+ /*!
168
+ \tparam Const Is this a constant iterator?
169
+ \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document)
170
+ \tparam Allocator Allocator type for allocating memory of object, array and string.
171
+
172
+ This class implements a Random Access Iterator for GenericMember elements
173
+ of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements].
174
+
175
+ \note This iterator implementation is mainly intended to avoid implicit
176
+ conversions from iterator values to \c NULL,
177
+ e.g. from GenericValue::FindMember.
178
+
179
+ \note Define \c RAPIDJSON_NOMEMBERITERATORCLASS to fall back to a
180
+ pointer-based implementation, if your platform doesn't provide
181
+ the C++ <iterator> header.
182
+
183
+ \see GenericMember, GenericValue::MemberIterator, GenericValue::ConstMemberIterator
184
+ */
185
+ template <bool Const, typename Encoding, typename Allocator>
186
+ class GenericMemberIterator {
187
+
188
+ friend class GenericValue<Encoding,Allocator>;
189
+ template <bool, typename, typename> friend class GenericMemberIterator;
190
+
191
+ typedef GenericMember<Encoding,Allocator> PlainType;
192
+ typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;
193
+
194
+ public:
195
+ //! Iterator type itself
196
+ typedef GenericMemberIterator Iterator;
197
+ //! Constant iterator type
198
+ typedef GenericMemberIterator<true,Encoding,Allocator> ConstIterator;
199
+ //! Non-constant iterator type
200
+ typedef GenericMemberIterator<false,Encoding,Allocator> NonConstIterator;
201
+
202
+ /** \name std::iterator_traits support */
203
+ //@{
204
+ typedef ValueType value_type;
205
+ typedef ValueType * pointer;
206
+ typedef ValueType & reference;
207
+ typedef std::ptrdiff_t difference_type;
208
+ typedef std::random_access_iterator_tag iterator_category;
209
+ //@}
210
+
211
+ //! Pointer to (const) GenericMember
212
+ typedef pointer Pointer;
213
+ //! Reference to (const) GenericMember
214
+ typedef reference Reference;
215
+ //! Signed integer type (e.g. \c ptrdiff_t)
216
+ typedef difference_type DifferenceType;
217
+
218
+ //! Default constructor (singular value)
219
+ /*! Creates an iterator pointing to no element.
220
+ \note All operations, except for comparisons, are undefined on such values.
221
+ */
222
+ GenericMemberIterator() : ptr_() {}
223
+
224
+ //! Iterator conversions to more const
225
+ /*!
226
+ \param it (Non-const) iterator to copy from
227
+
228
+ Allows the creation of an iterator from another GenericMemberIterator
229
+ that is "less const". Especially, creating a non-constant iterator
230
+ from a constant iterator are disabled:
231
+ \li const -> non-const (not ok)
232
+ \li const -> const (ok)
233
+ \li non-const -> const (ok)
234
+ \li non-const -> non-const (ok)
235
+
236
+ \note If the \c Const template parameter is already \c false, this
237
+ constructor effectively defines a regular copy-constructor.
238
+ Otherwise, the copy constructor is implicitly defined.
239
+ */
240
+ GenericMemberIterator(const NonConstIterator & it) : ptr_(it.ptr_) {}
241
+ Iterator& operator=(const NonConstIterator & it) { ptr_ = it.ptr_; return *this; }
242
+
243
+ //! @name stepping
244
+ //@{
245
+ Iterator& operator++(){ ++ptr_; return *this; }
246
+ Iterator& operator--(){ --ptr_; return *this; }
247
+ Iterator operator++(int){ Iterator old(*this); ++ptr_; return old; }
248
+ Iterator operator--(int){ Iterator old(*this); --ptr_; return old; }
249
+ //@}
250
+
251
+ //! @name increment/decrement
252
+ //@{
253
+ Iterator operator+(DifferenceType n) const { return Iterator(ptr_+n); }
254
+ Iterator operator-(DifferenceType n) const { return Iterator(ptr_-n); }
255
+
256
+ Iterator& operator+=(DifferenceType n) { ptr_+=n; return *this; }
257
+ Iterator& operator-=(DifferenceType n) { ptr_-=n; return *this; }
258
+ //@}
259
+
260
+ //! @name relations
261
+ //@{
262
+ template <bool Const_> bool operator==(const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ == that.ptr_; }
263
+ template <bool Const_> bool operator!=(const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ != that.ptr_; }
264
+ template <bool Const_> bool operator<=(const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ <= that.ptr_; }
265
+ template <bool Const_> bool operator>=(const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ >= that.ptr_; }
266
+ template <bool Const_> bool operator< (const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ < that.ptr_; }
267
+ template <bool Const_> bool operator> (const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ > that.ptr_; }
268
+
269
+ #ifdef __cpp_lib_three_way_comparison
270
+ template <bool Const_> std::strong_ordering operator<=>(const GenericMemberIterator<Const_, Encoding, Allocator>& that) const { return ptr_ <=> that.ptr_; }
271
+ #endif
272
+ //@}
273
+
274
+ //! @name dereference
275
+ //@{
276
+ Reference operator*() const { return *ptr_; }
277
+ Pointer operator->() const { return ptr_; }
278
+ Reference operator[](DifferenceType n) const { return ptr_[n]; }
279
+ //@}
280
+
281
+ //! Distance
282
+ DifferenceType operator-(ConstIterator that) const { return ptr_-that.ptr_; }
283
+
284
+ private:
285
+ //! Internal constructor from plain pointer
286
+ explicit GenericMemberIterator(Pointer p) : ptr_(p) {}
287
+
288
+ Pointer ptr_; //!< raw pointer
289
+ };
290
+
291
+ #else // RAPIDJSON_NOMEMBERITERATORCLASS
292
+
293
+ // class-based member iterator implementation disabled, use plain pointers
294
+
295
+ template <bool Const, typename Encoding, typename Allocator>
296
+ class GenericMemberIterator;
297
+
298
+ //! non-const GenericMemberIterator
299
+ template <typename Encoding, typename Allocator>
300
+ class GenericMemberIterator<false,Encoding,Allocator> {
301
+ public:
302
+ //! use plain pointer as iterator type
303
+ typedef GenericMember<Encoding,Allocator>* Iterator;
304
+ };
305
+ //! const GenericMemberIterator
306
+ template <typename Encoding, typename Allocator>
307
+ class GenericMemberIterator<true,Encoding,Allocator> {
308
+ public:
309
+ //! use plain const pointer as iterator type
310
+ typedef const GenericMember<Encoding,Allocator>* Iterator;
311
+ };
312
+
313
+ #endif // RAPIDJSON_NOMEMBERITERATORCLASS
314
+
315
+ ///////////////////////////////////////////////////////////////////////////////
316
+ // GenericStringRef
317
+
318
+ //! Reference to a constant string (not taking a copy)
319
+ /*!
320
+ \tparam CharType character type of the string
321
+
322
+ This helper class is used to automatically infer constant string
323
+ references for string literals, especially from \c const \b (!)
324
+ character arrays.
325
+
326
+ The main use is for creating JSON string values without copying the
327
+ source string via an \ref Allocator. This requires that the referenced
328
+ string pointers have a sufficient lifetime, which exceeds the lifetime
329
+ of the associated GenericValue.
330
+
331
+ \b Example
332
+ \code
333
+ Value v("foo"); // ok, no need to copy & calculate length
334
+ const char foo[] = "foo";
335
+ v.SetString(foo); // ok
336
+
337
+ const char* bar = foo;
338
+ // Value x(bar); // not ok, can't rely on bar's lifetime
339
+ Value x(StringRef(bar)); // lifetime explicitly guaranteed by user
340
+ Value y(StringRef(bar, 3)); // ok, explicitly pass length
341
+ \endcode
342
+
343
+ \see StringRef, GenericValue::SetString
344
+ */
345
+ template<typename CharType>
346
+ struct GenericStringRef {
347
+ typedef CharType Ch; //!< character type of the string
348
+
349
+ //! Create string reference from \c const character array
350
+ #ifndef __clang__ // -Wdocumentation
351
+ /*!
352
+ This constructor implicitly creates a constant string reference from
353
+ a \c const character array. It has better performance than
354
+ \ref StringRef(const CharType*) by inferring the string \ref length
355
+ from the array length, and also supports strings containing null
356
+ characters.
357
+
358
+ \tparam N length of the string, automatically inferred
359
+
360
+ \param str Constant character array, lifetime assumed to be longer
361
+ than the use of the string in e.g. a GenericValue
362
+
363
+ \post \ref s == str
364
+
365
+ \note Constant complexity.
366
+ \note There is a hidden, private overload to disallow references to
367
+ non-const character arrays to be created via this constructor.
368
+ By this, e.g. function-scope arrays used to be filled via
369
+ \c snprintf are excluded from consideration.
370
+ In such cases, the referenced string should be \b copied to the
371
+ GenericValue instead.
372
+ */
373
+ #endif
374
+ template<SizeType N>
375
+ GenericStringRef(const CharType (&str)[N]) RAPIDJSON_NOEXCEPT
376
+ : s(str), length(N-1) {}
377
+
378
+ //! Explicitly create string reference from \c const character pointer
379
+ #ifndef __clang__ // -Wdocumentation
380
+ /*!
381
+ This constructor can be used to \b explicitly create a reference to
382
+ a constant string pointer.
383
+
384
+ \see StringRef(const CharType*)
385
+
386
+ \param str Constant character pointer, lifetime assumed to be longer
387
+ than the use of the string in e.g. a GenericValue
388
+
389
+ \post \ref s == str
390
+
391
+ \note There is a hidden, private overload to disallow references to
392
+ non-const character arrays to be created via this constructor.
393
+ By this, e.g. function-scope arrays used to be filled via
394
+ \c snprintf are excluded from consideration.
395
+ In such cases, the referenced string should be \b copied to the
396
+ GenericValue instead.
397
+ */
398
+ #endif
399
+ explicit GenericStringRef(const CharType* str)
400
+ : s(str), length(NotNullStrLen(str)) {}
401
+
402
+ //! Create constant string reference from pointer and length
403
+ #ifndef __clang__ // -Wdocumentation
404
+ /*! \param str constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
405
+ \param len length of the string, excluding the trailing NULL terminator
406
+
407
+ \post \ref s == str && \ref length == len
408
+ \note Constant complexity.
409
+ */
410
+ #endif
411
+ GenericStringRef(const CharType* str, SizeType len)
412
+ : s(RAPIDJSON_LIKELY(str) ? str : emptyString), length(len) { RAPIDJSON_ASSERT(str != 0 || len == 0u); }
413
+
414
+ GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}
415
+
416
+ //! implicit conversion to plain CharType pointer
417
+ operator const Ch *() const { return s; }
418
+
419
+ const Ch* const s; //!< plain CharType pointer
420
+ const SizeType length; //!< length of the string (excluding the trailing NULL terminator)
421
+
422
+ private:
423
+ SizeType NotNullStrLen(const CharType* str) {
424
+ RAPIDJSON_ASSERT(str != 0);
425
+ return internal::StrLen(str);
426
+ }
427
+
428
+ /// Empty string - used when passing in a NULL pointer
429
+ static const Ch emptyString[];
430
+
431
+ //! Disallow construction from non-const array
432
+ template<SizeType N>
433
+ GenericStringRef(CharType (&str)[N]) /* = delete */;
434
+ //! Copy assignment operator not permitted - immutable type
435
+ GenericStringRef& operator=(const GenericStringRef& rhs) /* = delete */;
436
+ };
437
+
438
+ template<typename CharType>
439
+ const CharType GenericStringRef<CharType>::emptyString[] = { CharType() };
440
+
441
+ //! Mark a character pointer as constant string
442
+ /*! Mark a plain character pointer as a "string literal". This function
443
+ can be used to avoid copying a character string to be referenced as a
444
+ value in a JSON GenericValue object, if the string's lifetime is known
445
+ to be valid long enough.
446
+ \tparam CharType Character type of the string
447
+ \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
448
+ \return GenericStringRef string reference object
449
+ \relatesalso GenericStringRef
450
+
451
+ \see GenericValue::GenericValue(StringRefType), GenericValue::operator=(StringRefType), GenericValue::SetString(StringRefType), GenericValue::PushBack(StringRefType, Allocator&), GenericValue::AddMember
452
+ */
453
+ template<typename CharType>
454
+ inline GenericStringRef<CharType> StringRef(const CharType* str) {
455
+ return GenericStringRef<CharType>(str);
456
+ }
457
+
458
+ //! Mark a character pointer as constant string
459
+ /*! Mark a plain character pointer as a "string literal". This function
460
+ can be used to avoid copying a character string to be referenced as a
461
+ value in a JSON GenericValue object, if the string's lifetime is known
462
+ to be valid long enough.
463
+
464
+ This version has better performance with supplied length, and also
465
+ supports string containing null characters.
466
+
467
+ \tparam CharType character type of the string
468
+ \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
469
+ \param length The length of source string.
470
+ \return GenericStringRef string reference object
471
+ \relatesalso GenericStringRef
472
+ */
473
+ template<typename CharType>
474
+ inline GenericStringRef<CharType> StringRef(const CharType* str, size_t length) {
475
+ return GenericStringRef<CharType>(str, SizeType(length));
476
+ }
477
+
478
+ #if RAPIDJSON_HAS_STDSTRING
479
+ //! Mark a string object as constant string
480
+ /*! Mark a string object (e.g. \c std::string) as a "string literal".
481
+ This function can be used to avoid copying a string to be referenced as a
482
+ value in a JSON GenericValue object, if the string's lifetime is known
483
+ to be valid long enough.
484
+
485
+ \tparam CharType character type of the string
486
+ \param str Constant string, lifetime assumed to be longer than the use of the string in e.g. a GenericValue
487
+ \return GenericStringRef string reference object
488
+ \relatesalso GenericStringRef
489
+ \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
490
+ */
491
+ template<typename CharType>
492
+ inline GenericStringRef<CharType> StringRef(const std::basic_string<CharType>& str) {
493
+ return GenericStringRef<CharType>(str.data(), SizeType(str.size()));
494
+ }
495
+ #endif
496
+
497
+ ///////////////////////////////////////////////////////////////////////////////
498
+ // GenericValue type traits
499
+ namespace internal {
500
+
501
+ template <typename T, typename Encoding = void, typename Allocator = void>
502
+ struct IsGenericValueImpl : FalseType {};
503
+
504
+ // select candidates according to nested encoding and allocator types
505
+ template <typename T> struct IsGenericValueImpl<T, typename Void<typename T::EncodingType>::Type, typename Void<typename T::AllocatorType>::Type>
506
+ : IsBaseOf<GenericValue<typename T::EncodingType, typename T::AllocatorType>, T>::Type {};
507
+
508
+ // helper to match arbitrary GenericValue instantiations, including derived classes
509
+ template <typename T> struct IsGenericValue : IsGenericValueImpl<T>::Type {};
510
+
511
+ } // namespace internal
512
+
513
+ ///////////////////////////////////////////////////////////////////////////////
514
+ // TypeHelper
515
+
516
+ namespace internal {
517
+
518
+ template <typename ValueType, typename T>
519
+ struct TypeHelper {};
520
+
521
+ template<typename ValueType>
522
+ struct TypeHelper<ValueType, bool> {
523
+ static bool Is(const ValueType& v) { return v.IsBool(); }
524
+ static bool Get(const ValueType& v) { return v.GetBool(); }
525
+ static ValueType& Set(ValueType& v, bool data) { return v.SetBool(data); }
526
+ static ValueType& Set(ValueType& v, bool data, typename ValueType::AllocatorType&) { return v.SetBool(data); }
527
+ };
528
+
529
+ template<typename ValueType>
530
+ struct TypeHelper<ValueType, int> {
531
+ static bool Is(const ValueType& v) { return v.IsInt(); }
532
+ static int Get(const ValueType& v) { return v.GetInt(); }
533
+ static ValueType& Set(ValueType& v, int data) { return v.SetInt(data); }
534
+ static ValueType& Set(ValueType& v, int data, typename ValueType::AllocatorType&) { return v.SetInt(data); }
535
+ };
536
+
537
+ template<typename ValueType>
538
+ struct TypeHelper<ValueType, unsigned> {
539
+ static bool Is(const ValueType& v) { return v.IsUint(); }
540
+ static unsigned Get(const ValueType& v) { return v.GetUint(); }
541
+ static ValueType& Set(ValueType& v, unsigned data) { return v.SetUint(data); }
542
+ static ValueType& Set(ValueType& v, unsigned data, typename ValueType::AllocatorType&) { return v.SetUint(data); }
543
+ };
544
+
545
+ #ifdef _MSC_VER
546
+ RAPIDJSON_STATIC_ASSERT(sizeof(long) == sizeof(int));
547
+ template<typename ValueType>
548
+ struct TypeHelper<ValueType, long> {
549
+ static bool Is(const ValueType& v) { return v.IsInt(); }
550
+ static long Get(const ValueType& v) { return v.GetInt(); }
551
+ static ValueType& Set(ValueType& v, long data) { return v.SetInt(data); }
552
+ static ValueType& Set(ValueType& v, long data, typename ValueType::AllocatorType&) { return v.SetInt(data); }
553
+ };
554
+
555
+ RAPIDJSON_STATIC_ASSERT(sizeof(unsigned long) == sizeof(unsigned));
556
+ template<typename ValueType>
557
+ struct TypeHelper<ValueType, unsigned long> {
558
+ static bool Is(const ValueType& v) { return v.IsUint(); }
559
+ static unsigned long Get(const ValueType& v) { return v.GetUint(); }
560
+ static ValueType& Set(ValueType& v, unsigned long data) { return v.SetUint(data); }
561
+ static ValueType& Set(ValueType& v, unsigned long data, typename ValueType::AllocatorType&) { return v.SetUint(data); }
562
+ };
563
+ #endif
564
+
565
+ template<typename ValueType>
566
+ struct TypeHelper<ValueType, int64_t> {
567
+ static bool Is(const ValueType& v) { return v.IsInt64(); }
568
+ static int64_t Get(const ValueType& v) { return v.GetInt64(); }
569
+ static ValueType& Set(ValueType& v, int64_t data) { return v.SetInt64(data); }
570
+ static ValueType& Set(ValueType& v, int64_t data, typename ValueType::AllocatorType&) { return v.SetInt64(data); }
571
+ };
572
+
573
+ template<typename ValueType>
574
+ struct TypeHelper<ValueType, uint64_t> {
575
+ static bool Is(const ValueType& v) { return v.IsUint64(); }
576
+ static uint64_t Get(const ValueType& v) { return v.GetUint64(); }
577
+ static ValueType& Set(ValueType& v, uint64_t data) { return v.SetUint64(data); }
578
+ static ValueType& Set(ValueType& v, uint64_t data, typename ValueType::AllocatorType&) { return v.SetUint64(data); }
579
+ };
580
+
581
+ template<typename ValueType>
582
+ struct TypeHelper<ValueType, double> {
583
+ static bool Is(const ValueType& v) { return v.IsDouble(); }
584
+ static double Get(const ValueType& v) { return v.GetDouble(); }
585
+ static ValueType& Set(ValueType& v, double data) { return v.SetDouble(data); }
586
+ static ValueType& Set(ValueType& v, double data, typename ValueType::AllocatorType&) { return v.SetDouble(data); }
587
+ };
588
+
589
+ template<typename ValueType>
590
+ struct TypeHelper<ValueType, float> {
591
+ static bool Is(const ValueType& v) { return v.IsFloat(); }
592
+ static float Get(const ValueType& v) { return v.GetFloat(); }
593
+ static ValueType& Set(ValueType& v, float data) { return v.SetFloat(data); }
594
+ static ValueType& Set(ValueType& v, float data, typename ValueType::AllocatorType&) { return v.SetFloat(data); }
595
+ };
596
+
597
+ template<typename ValueType>
598
+ struct TypeHelper<ValueType, const typename ValueType::Ch*> {
599
+ typedef const typename ValueType::Ch* StringType;
600
+ static bool Is(const ValueType& v) { return v.IsString(); }
601
+ static StringType Get(const ValueType& v) { return v.GetString(); }
602
+ static ValueType& Set(ValueType& v, const StringType data) { return v.SetString(typename ValueType::StringRefType(data)); }
603
+ static ValueType& Set(ValueType& v, const StringType data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); }
604
+ };
605
+
606
+ #if RAPIDJSON_HAS_STDSTRING
607
+ template<typename ValueType>
608
+ struct TypeHelper<ValueType, std::basic_string<typename ValueType::Ch> > {
609
+ typedef std::basic_string<typename ValueType::Ch> StringType;
610
+ static bool Is(const ValueType& v) { return v.IsString(); }
611
+ static StringType Get(const ValueType& v) { return StringType(v.GetString(), v.GetStringLength()); }
612
+ static ValueType& Set(ValueType& v, const StringType& data, typename ValueType::AllocatorType& a) { return v.SetString(data, a); }
613
+ };
614
+ #endif
615
+
616
+ template<typename ValueType>
617
+ struct TypeHelper<ValueType, typename ValueType::Array> {
618
+ typedef typename ValueType::Array ArrayType;
619
+ static bool Is(const ValueType& v) { return v.IsArray(); }
620
+ static ArrayType Get(ValueType& v) { return v.GetArray(); }
621
+ static ValueType& Set(ValueType& v, ArrayType data) { return v = data; }
622
+ static ValueType& Set(ValueType& v, ArrayType data, typename ValueType::AllocatorType&) { return v = data; }
623
+ };
624
+
625
+ template<typename ValueType>
626
+ struct TypeHelper<ValueType, typename ValueType::ConstArray> {
627
+ typedef typename ValueType::ConstArray ArrayType;
628
+ static bool Is(const ValueType& v) { return v.IsArray(); }
629
+ static ArrayType Get(const ValueType& v) { return v.GetArray(); }
630
+ };
631
+
632
+ template<typename ValueType>
633
+ struct TypeHelper<ValueType, typename ValueType::Object> {
634
+ typedef typename ValueType::Object ObjectType;
635
+ static bool Is(const ValueType& v) { return v.IsObject(); }
636
+ static ObjectType Get(ValueType& v) { return v.GetObject(); }
637
+ static ValueType& Set(ValueType& v, ObjectType data) { return v = data; }
638
+ static ValueType& Set(ValueType& v, ObjectType data, typename ValueType::AllocatorType&) { return v = data; }
639
+ };
640
+
641
+ template<typename ValueType>
642
+ struct TypeHelper<ValueType, typename ValueType::ConstObject> {
643
+ typedef typename ValueType::ConstObject ObjectType;
644
+ static bool Is(const ValueType& v) { return v.IsObject(); }
645
+ static ObjectType Get(const ValueType& v) { return v.GetObject(); }
646
+ };
647
+
648
+ } // namespace internal
649
+
650
+ // Forward declarations
651
+ template <bool, typename> class GenericArray;
652
+ template <bool, typename> class GenericObject;
653
+
654
+ ///////////////////////////////////////////////////////////////////////////////
655
+ // GenericValue
656
+
657
+ //! Represents a JSON value. Use Value for UTF8 encoding and default allocator.
658
+ /*!
659
+ A JSON value can be one of 7 types. This class is a variant type supporting
660
+ these types.
661
+
662
+ Use the Value if UTF8 and default allocator
663
+
664
+ \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document)
665
+ \tparam Allocator Allocator type for allocating memory of object, array and string.
666
+ */
667
+ template <typename Encoding, typename Allocator = RAPIDJSON_DEFAULT_ALLOCATOR >
668
+ class GenericValue {
669
+ public:
670
+ //! Name-value pair in an object.
671
+ typedef GenericMember<Encoding, Allocator> Member;
672
+ typedef Encoding EncodingType; //!< Encoding type from template parameter.
673
+ typedef Allocator AllocatorType; //!< Allocator type from template parameter.
674
+ typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding.
675
+ typedef GenericStringRef<Ch> StringRefType; //!< Reference to a constant string
676
+ typedef typename GenericMemberIterator<false,Encoding,Allocator>::Iterator MemberIterator; //!< Member iterator for iterating in object.
677
+ typedef typename GenericMemberIterator<true,Encoding,Allocator>::Iterator ConstMemberIterator; //!< Constant member iterator for iterating in object.
678
+ typedef GenericValue* ValueIterator; //!< Value iterator for iterating in array.
679
+ typedef const GenericValue* ConstValueIterator; //!< Constant value iterator for iterating in array.
680
+ typedef GenericValue<Encoding, Allocator> ValueType; //!< Value type of itself.
681
+ typedef GenericArray<false, ValueType> Array;
682
+ typedef GenericArray<true, ValueType> ConstArray;
683
+ typedef GenericObject<false, ValueType> Object;
684
+ typedef GenericObject<true, ValueType> ConstObject;
685
+
686
+ //!@name Constructors and destructor.
687
+ //@{
688
+
689
+ //! Default constructor creates a null value.
690
+ GenericValue() RAPIDJSON_NOEXCEPT : data_() { data_.f.flags = kNullFlag; }
691
+
692
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
693
+ //! Move constructor in C++11
694
+ GenericValue(GenericValue&& rhs) RAPIDJSON_NOEXCEPT : data_(rhs.data_) {
695
+ rhs.data_.f.flags = kNullFlag; // give up contents
696
+ }
697
+ #endif
698
+
699
+ private:
700
+ //! Copy constructor is not permitted.
701
+ GenericValue(const GenericValue& rhs);
702
+
703
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
704
+ //! Moving from a GenericDocument is not permitted.
705
+ template <typename StackAllocator>
706
+ GenericValue(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
707
+
708
+ //! Move assignment from a GenericDocument is not permitted.
709
+ template <typename StackAllocator>
710
+ GenericValue& operator=(GenericDocument<Encoding,Allocator,StackAllocator>&& rhs);
711
+ #endif
712
+
713
+ public:
714
+
715
+ //! Constructor with JSON value type.
716
+ /*! This creates a Value of specified type with default content.
717
+ \param type Type of the value.
718
+ \note Default content for number is zero.
719
+ */
720
+ explicit GenericValue(Type type) RAPIDJSON_NOEXCEPT : data_() {
721
+ static const uint16_t defaultFlags[] = {
722
+ kNullFlag, kFalseFlag, kTrueFlag, kObjectFlag, kArrayFlag, kShortStringFlag,
723
+ kNumberAnyFlag
724
+ };
725
+ RAPIDJSON_NOEXCEPT_ASSERT(type >= kNullType && type <= kNumberType);
726
+ data_.f.flags = defaultFlags[type];
727
+
728
+ // Use ShortString to store empty string.
729
+ if (type == kStringType)
730
+ data_.ss.SetLength(0);
731
+ }
732
+
733
+ //! Explicit copy constructor (with allocator)
734
+ /*! Creates a copy of a Value by using the given Allocator
735
+ \tparam SourceAllocator allocator of \c rhs
736
+ \param rhs Value to copy from (read-only)
737
+ \param allocator Allocator for allocating copied elements and buffers. Commonly use GenericDocument::GetAllocator().
738
+ \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer)
739
+ \see CopyFrom()
740
+ */
741
+ template <typename SourceAllocator>
742
+ GenericValue(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator, bool copyConstStrings = false) {
743
+ switch (rhs.GetType()) {
744
+ case kObjectType:
745
+ DoCopyMembers(rhs, allocator, copyConstStrings);
746
+ break;
747
+ case kArrayType: {
748
+ SizeType count = rhs.data_.a.size;
749
+ GenericValue* le = reinterpret_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));
750
+ const GenericValue<Encoding,SourceAllocator>* re = rhs.GetElementsPointer();
751
+ for (SizeType i = 0; i < count; i++)
752
+ new (&le[i]) GenericValue(re[i], allocator, copyConstStrings);
753
+ data_.f.flags = kArrayFlag;
754
+ data_.a.size = data_.a.capacity = count;
755
+ SetElementsPointer(le);
756
+ }
757
+ break;
758
+ case kStringType:
759
+ if (rhs.data_.f.flags == kConstStringFlag && !copyConstStrings) {
760
+ data_.f.flags = rhs.data_.f.flags;
761
+ data_ = *reinterpret_cast<const Data*>(&rhs.data_);
762
+ }
763
+ else
764
+ SetStringRaw(StringRef(rhs.GetString(), rhs.GetStringLength()), allocator);
765
+ break;
766
+ default:
767
+ data_.f.flags = rhs.data_.f.flags;
768
+ data_ = *reinterpret_cast<const Data*>(&rhs.data_);
769
+ break;
770
+ }
771
+ }
772
+
773
+ //! Constructor for boolean value.
774
+ /*! \param b Boolean value
775
+ \note This constructor is limited to \em real boolean values and rejects
776
+ implicitly converted types like arbitrary pointers. Use an explicit cast
777
+ to \c bool, if you want to construct a boolean JSON value in such cases.
778
+ */
779
+ #ifndef RAPIDJSON_DOXYGEN_RUNNING // hide SFINAE from Doxygen
780
+ template <typename T>
781
+ explicit GenericValue(T b, RAPIDJSON_ENABLEIF((internal::IsSame<bool, T>))) RAPIDJSON_NOEXCEPT // See #472
782
+ #else
783
+ explicit GenericValue(bool b) RAPIDJSON_NOEXCEPT
784
+ #endif
785
+ : data_() {
786
+ // safe-guard against failing SFINAE
787
+ RAPIDJSON_STATIC_ASSERT((internal::IsSame<bool,T>::Value));
788
+ data_.f.flags = b ? kTrueFlag : kFalseFlag;
789
+ }
790
+
791
+ //! Constructor for int value.
792
+ explicit GenericValue(int i) RAPIDJSON_NOEXCEPT : data_() {
793
+ data_.n.i64 = i;
794
+ data_.f.flags = (i >= 0) ? (kNumberIntFlag | kUintFlag | kUint64Flag) : kNumberIntFlag;
795
+ }
796
+
797
+ //! Constructor for unsigned value.
798
+ explicit GenericValue(unsigned u) RAPIDJSON_NOEXCEPT : data_() {
799
+ data_.n.u64 = u;
800
+ data_.f.flags = (u & 0x80000000) ? kNumberUintFlag : (kNumberUintFlag | kIntFlag | kInt64Flag);
801
+ }
802
+
803
+ //! Constructor for int64_t value.
804
+ explicit GenericValue(int64_t i64) RAPIDJSON_NOEXCEPT : data_() {
805
+ data_.n.i64 = i64;
806
+ data_.f.flags = kNumberInt64Flag;
807
+ if (i64 >= 0) {
808
+ data_.f.flags |= kNumberUint64Flag;
809
+ if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
810
+ data_.f.flags |= kUintFlag;
811
+ if (!(static_cast<uint64_t>(i64) & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
812
+ data_.f.flags |= kIntFlag;
813
+ }
814
+ else if (i64 >= static_cast<int64_t>(RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
815
+ data_.f.flags |= kIntFlag;
816
+ }
817
+
818
+ //! Constructor for uint64_t value.
819
+ explicit GenericValue(uint64_t u64) RAPIDJSON_NOEXCEPT : data_() {
820
+ data_.n.u64 = u64;
821
+ data_.f.flags = kNumberUint64Flag;
822
+ if (!(u64 & RAPIDJSON_UINT64_C2(0x80000000, 0x00000000)))
823
+ data_.f.flags |= kInt64Flag;
824
+ if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x00000000)))
825
+ data_.f.flags |= kUintFlag;
826
+ if (!(u64 & RAPIDJSON_UINT64_C2(0xFFFFFFFF, 0x80000000)))
827
+ data_.f.flags |= kIntFlag;
828
+ }
829
+
830
+ //! Constructor for double value.
831
+ explicit GenericValue(double d) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = d; data_.f.flags = kNumberDoubleFlag; }
832
+
833
+ //! Constructor for float value.
834
+ explicit GenericValue(float f) RAPIDJSON_NOEXCEPT : data_() { data_.n.d = static_cast<double>(f); data_.f.flags = kNumberDoubleFlag; }
835
+
836
+ //! Constructor for constant string (i.e. do not make a copy of string)
837
+ GenericValue(const Ch* s, SizeType length) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(StringRef(s, length)); }
838
+
839
+ //! Constructor for constant string (i.e. do not make a copy of string)
840
+ explicit GenericValue(StringRefType s) RAPIDJSON_NOEXCEPT : data_() { SetStringRaw(s); }
841
+
842
+ //! Constructor for copy-string (i.e. do make a copy of string)
843
+ GenericValue(const Ch* s, SizeType length, Allocator& allocator) : data_() { SetStringRaw(StringRef(s, length), allocator); }
844
+
845
+ //! Constructor for copy-string (i.e. do make a copy of string)
846
+ GenericValue(const Ch*s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); }
847
+
848
+ #if RAPIDJSON_HAS_STDSTRING
849
+ //! Constructor for copy-string from a string object (i.e. do make a copy of string)
850
+ /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
851
+ */
852
+ GenericValue(const std::basic_string<Ch>& s, Allocator& allocator) : data_() { SetStringRaw(StringRef(s), allocator); }
853
+ #endif
854
+
855
+ //! Constructor for Array.
856
+ /*!
857
+ \param a An array obtained by \c GetArray().
858
+ \note \c Array is always pass-by-value.
859
+ \note the source array is moved into this value and the sourec array becomes empty.
860
+ */
861
+ GenericValue(Array a) RAPIDJSON_NOEXCEPT : data_(a.value_.data_) {
862
+ a.value_.data_ = Data();
863
+ a.value_.data_.f.flags = kArrayFlag;
864
+ }
865
+
866
+ //! Constructor for Object.
867
+ /*!
868
+ \param o An object obtained by \c GetObject().
869
+ \note \c Object is always pass-by-value.
870
+ \note the source object is moved into this value and the sourec object becomes empty.
871
+ */
872
+ GenericValue(Object o) RAPIDJSON_NOEXCEPT : data_(o.value_.data_) {
873
+ o.value_.data_ = Data();
874
+ o.value_.data_.f.flags = kObjectFlag;
875
+ }
876
+
877
+ //! Destructor.
878
+ /*! Need to destruct elements of array, members of object, or copy-string.
879
+ */
880
+ ~GenericValue() {
881
+ // With RAPIDJSON_USE_MEMBERSMAP, the maps need to be destroyed to release
882
+ // their Allocator if it's refcounted (e.g. MemoryPoolAllocator).
883
+ if (Allocator::kNeedFree || (RAPIDJSON_USE_MEMBERSMAP+0 &&
884
+ internal::IsRefCounted<Allocator>::Value)) {
885
+ switch(data_.f.flags) {
886
+ case kArrayFlag:
887
+ {
888
+ GenericValue* e = GetElementsPointer();
889
+ for (GenericValue* v = e; v != e + data_.a.size; ++v)
890
+ v->~GenericValue();
891
+ if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
892
+ Allocator::Free(e);
893
+ }
894
+ }
895
+ break;
896
+
897
+ case kObjectFlag:
898
+ DoFreeMembers();
899
+ break;
900
+
901
+ case kCopyStringFlag:
902
+ if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
903
+ Allocator::Free(const_cast<Ch*>(GetStringPointer()));
904
+ }
905
+ break;
906
+
907
+ default:
908
+ break; // Do nothing for other types.
909
+ }
910
+ }
911
+ }
912
+
913
+ //@}
914
+
915
+ //!@name Assignment operators
916
+ //@{
917
+
918
+ //! Assignment with move semantics.
919
+ /*! \param rhs Source of the assignment. It will become a null value after assignment.
920
+ */
921
+ GenericValue& operator=(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
922
+ if (RAPIDJSON_LIKELY(this != &rhs)) {
923
+ // Can't destroy "this" before assigning "rhs", otherwise "rhs"
924
+ // could be used after free if it's an sub-Value of "this",
925
+ // hence the temporary danse.
926
+ GenericValue temp;
927
+ temp.RawAssign(rhs);
928
+ this->~GenericValue();
929
+ RawAssign(temp);
930
+ }
931
+ return *this;
932
+ }
933
+
934
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
935
+ //! Move assignment in C++11
936
+ GenericValue& operator=(GenericValue&& rhs) RAPIDJSON_NOEXCEPT {
937
+ return *this = rhs.Move();
938
+ }
939
+ #endif
940
+
941
+ //! Assignment of constant string reference (no copy)
942
+ /*! \param str Constant string reference to be assigned
943
+ \note This overload is needed to avoid clashes with the generic primitive type assignment overload below.
944
+ \see GenericStringRef, operator=(T)
945
+ */
946
+ GenericValue& operator=(StringRefType str) RAPIDJSON_NOEXCEPT {
947
+ GenericValue s(str);
948
+ return *this = s;
949
+ }
950
+
951
+ //! Assignment with primitive types.
952
+ /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
953
+ \param value The value to be assigned.
954
+
955
+ \note The source type \c T explicitly disallows all pointer types,
956
+ especially (\c const) \ref Ch*. This helps avoiding implicitly
957
+ referencing character strings with insufficient lifetime, use
958
+ \ref SetString(const Ch*, Allocator&) (for copying) or
959
+ \ref StringRef() (to explicitly mark the pointer as constant) instead.
960
+ All other pointer types would implicitly convert to \c bool,
961
+ use \ref SetBool() instead.
962
+ */
963
+ template <typename T>
964
+ RAPIDJSON_DISABLEIF_RETURN((internal::IsPointer<T>), (GenericValue&))
965
+ operator=(T value) {
966
+ GenericValue v(value);
967
+ return *this = v;
968
+ }
969
+
970
+ //! Deep-copy assignment from Value
971
+ /*! Assigns a \b copy of the Value to the current Value object
972
+ \tparam SourceAllocator Allocator type of \c rhs
973
+ \param rhs Value to copy from (read-only)
974
+ \param allocator Allocator to use for copying
975
+ \param copyConstStrings Force copying of constant strings (e.g. referencing an in-situ buffer)
976
+ */
977
+ template <typename SourceAllocator>
978
+ GenericValue& CopyFrom(const GenericValue<Encoding, SourceAllocator>& rhs, Allocator& allocator, bool copyConstStrings = false) {
979
+ RAPIDJSON_ASSERT(static_cast<void*>(this) != static_cast<void const*>(&rhs));
980
+ this->~GenericValue();
981
+ new (this) GenericValue(rhs, allocator, copyConstStrings);
982
+ return *this;
983
+ }
984
+
985
+ //! Exchange the contents of this value with those of other.
986
+ /*!
987
+ \param other Another value.
988
+ \note Constant complexity.
989
+ */
990
+ GenericValue& Swap(GenericValue& other) RAPIDJSON_NOEXCEPT {
991
+ GenericValue temp;
992
+ temp.RawAssign(*this);
993
+ RawAssign(other);
994
+ other.RawAssign(temp);
995
+ return *this;
996
+ }
997
+
998
+ //! free-standing swap function helper
999
+ /*!
1000
+ Helper function to enable support for common swap implementation pattern based on \c std::swap:
1001
+ \code
1002
+ void swap(MyClass& a, MyClass& b) {
1003
+ using std::swap;
1004
+ swap(a.value, b.value);
1005
+ // ...
1006
+ }
1007
+ \endcode
1008
+ \see Swap()
1009
+ */
1010
+ friend inline void swap(GenericValue& a, GenericValue& b) RAPIDJSON_NOEXCEPT { a.Swap(b); }
1011
+
1012
+ //! Prepare Value for move semantics
1013
+ /*! \return *this */
1014
+ GenericValue& Move() RAPIDJSON_NOEXCEPT { return *this; }
1015
+ //@}
1016
+
1017
+ //!@name Equal-to and not-equal-to operators
1018
+ //@{
1019
+ //! Equal-to operator
1020
+ /*!
1021
+ \note If an object contains duplicated named member, comparing equality with any object is always \c false.
1022
+ \note Complexity is quadratic in Object's member number and linear for the rest (number of all values in the subtree and total lengths of all strings).
1023
+ */
1024
+ template <typename SourceAllocator>
1025
+ bool operator==(const GenericValue<Encoding, SourceAllocator>& rhs) const {
1026
+ typedef GenericValue<Encoding, SourceAllocator> RhsType;
1027
+ if (GetType() != rhs.GetType())
1028
+ return false;
1029
+
1030
+ switch (GetType()) {
1031
+ case kObjectType: // Warning: O(n^2) inner-loop
1032
+ if (data_.o.size != rhs.data_.o.size)
1033
+ return false;
1034
+ for (ConstMemberIterator lhsMemberItr = MemberBegin(); lhsMemberItr != MemberEnd(); ++lhsMemberItr) {
1035
+ typename RhsType::ConstMemberIterator rhsMemberItr = rhs.FindMember(lhsMemberItr->name);
1036
+ if (rhsMemberItr == rhs.MemberEnd() || lhsMemberItr->value != rhsMemberItr->value)
1037
+ return false;
1038
+ }
1039
+ return true;
1040
+
1041
+ case kArrayType:
1042
+ if (data_.a.size != rhs.data_.a.size)
1043
+ return false;
1044
+ for (SizeType i = 0; i < data_.a.size; i++)
1045
+ if ((*this)[i] != rhs[i])
1046
+ return false;
1047
+ return true;
1048
+
1049
+ case kStringType:
1050
+ return StringEqual(rhs);
1051
+
1052
+ case kNumberType:
1053
+ if (IsDouble() || rhs.IsDouble()) {
1054
+ double a = GetDouble(); // May convert from integer to double.
1055
+ double b = rhs.GetDouble(); // Ditto
1056
+ return a >= b && a <= b; // Prevent -Wfloat-equal
1057
+ }
1058
+ else
1059
+ return data_.n.u64 == rhs.data_.n.u64;
1060
+
1061
+ default:
1062
+ return true;
1063
+ }
1064
+ }
1065
+
1066
+ //! Equal-to operator with const C-string pointer
1067
+ bool operator==(const Ch* rhs) const { return *this == GenericValue(StringRef(rhs)); }
1068
+
1069
+ #if RAPIDJSON_HAS_STDSTRING
1070
+ //! Equal-to operator with string object
1071
+ /*! \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
1072
+ */
1073
+ bool operator==(const std::basic_string<Ch>& rhs) const { return *this == GenericValue(StringRef(rhs)); }
1074
+ #endif
1075
+
1076
+ //! Equal-to operator with primitive types
1077
+ /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c true, \c false
1078
+ */
1079
+ template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>,internal::IsGenericValue<T> >), (bool)) operator==(const T& rhs) const { return *this == GenericValue(rhs); }
1080
+
1081
+ //! Not-equal-to operator
1082
+ /*! \return !(*this == rhs)
1083
+ */
1084
+ template <typename SourceAllocator>
1085
+ bool operator!=(const GenericValue<Encoding, SourceAllocator>& rhs) const { return !(*this == rhs); }
1086
+
1087
+ //! Not-equal-to operator with const C-string pointer
1088
+ bool operator!=(const Ch* rhs) const { return !(*this == rhs); }
1089
+
1090
+ //! Not-equal-to operator with arbitrary types
1091
+ /*! \return !(*this == rhs)
1092
+ */
1093
+ template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& rhs) const { return !(*this == rhs); }
1094
+
1095
+ #ifndef __cpp_lib_three_way_comparison
1096
+ //! Equal-to operator with arbitrary types (symmetric version)
1097
+ /*! \return (rhs == lhs)
1098
+ */
1099
+ template <typename T> friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator==(const T& lhs, const GenericValue& rhs) { return rhs == lhs; }
1100
+
1101
+ //! Not-Equal-to operator with arbitrary types (symmetric version)
1102
+ /*! \return !(rhs == lhs)
1103
+ */
1104
+ template <typename T> friend RAPIDJSON_DISABLEIF_RETURN((internal::IsGenericValue<T>), (bool)) operator!=(const T& lhs, const GenericValue& rhs) { return !(rhs == lhs); }
1105
+ //@}
1106
+ #endif
1107
+
1108
+ //!@name Type
1109
+ //@{
1110
+
1111
+ Type GetType() const { return static_cast<Type>(data_.f.flags & kTypeMask); }
1112
+ bool IsNull() const { return data_.f.flags == kNullFlag; }
1113
+ bool IsFalse() const { return data_.f.flags == kFalseFlag; }
1114
+ bool IsTrue() const { return data_.f.flags == kTrueFlag; }
1115
+ bool IsBool() const { return (data_.f.flags & kBoolFlag) != 0; }
1116
+ bool IsObject() const { return data_.f.flags == kObjectFlag; }
1117
+ bool IsArray() const { return data_.f.flags == kArrayFlag; }
1118
+ bool IsNumber() const { return (data_.f.flags & kNumberFlag) != 0; }
1119
+ bool IsInt() const { return (data_.f.flags & kIntFlag) != 0; }
1120
+ bool IsUint() const { return (data_.f.flags & kUintFlag) != 0; }
1121
+ bool IsInt64() const { return (data_.f.flags & kInt64Flag) != 0; }
1122
+ bool IsUint64() const { return (data_.f.flags & kUint64Flag) != 0; }
1123
+ bool IsDouble() const { return (data_.f.flags & kDoubleFlag) != 0; }
1124
+ bool IsString() const { return (data_.f.flags & kStringFlag) != 0; }
1125
+
1126
+ // Checks whether a number can be losslessly converted to a double.
1127
+ bool IsLosslessDouble() const {
1128
+ if (!IsNumber()) return false;
1129
+ if (IsUint64()) {
1130
+ uint64_t u = GetUint64();
1131
+ volatile double d = static_cast<double>(u);
1132
+ return (d >= 0.0)
1133
+ && (d < static_cast<double>((std::numeric_limits<uint64_t>::max)()))
1134
+ && (u == static_cast<uint64_t>(d));
1135
+ }
1136
+ if (IsInt64()) {
1137
+ int64_t i = GetInt64();
1138
+ volatile double d = static_cast<double>(i);
1139
+ return (d >= static_cast<double>((std::numeric_limits<int64_t>::min)()))
1140
+ && (d < static_cast<double>((std::numeric_limits<int64_t>::max)()))
1141
+ && (i == static_cast<int64_t>(d));
1142
+ }
1143
+ return true; // double, int, uint are always lossless
1144
+ }
1145
+
1146
+ // Checks whether a number is a float (possible lossy).
1147
+ bool IsFloat() const {
1148
+ if ((data_.f.flags & kDoubleFlag) == 0)
1149
+ return false;
1150
+ double d = GetDouble();
1151
+ return d >= -3.4028234e38 && d <= 3.4028234e38;
1152
+ }
1153
+ // Checks whether a number can be losslessly converted to a float.
1154
+ bool IsLosslessFloat() const {
1155
+ if (!IsNumber()) return false;
1156
+ double a = GetDouble();
1157
+ if (a < static_cast<double>(-(std::numeric_limits<float>::max)())
1158
+ || a > static_cast<double>((std::numeric_limits<float>::max)()))
1159
+ return false;
1160
+ double b = static_cast<double>(static_cast<float>(a));
1161
+ return a >= b && a <= b; // Prevent -Wfloat-equal
1162
+ }
1163
+
1164
+ //@}
1165
+
1166
+ //!@name Null
1167
+ //@{
1168
+
1169
+ GenericValue& SetNull() { this->~GenericValue(); new (this) GenericValue(); return *this; }
1170
+
1171
+ //@}
1172
+
1173
+ //!@name Bool
1174
+ //@{
1175
+
1176
+ bool GetBool() const { RAPIDJSON_ASSERT(IsBool()); return data_.f.flags == kTrueFlag; }
1177
+ //!< Set boolean value
1178
+ /*! \post IsBool() == true */
1179
+ GenericValue& SetBool(bool b) { this->~GenericValue(); new (this) GenericValue(b); return *this; }
1180
+
1181
+ //@}
1182
+
1183
+ //!@name Object
1184
+ //@{
1185
+
1186
+ //! Set this value as an empty object.
1187
+ /*! \post IsObject() == true */
1188
+ GenericValue& SetObject() { this->~GenericValue(); new (this) GenericValue(kObjectType); return *this; }
1189
+
1190
+ //! Get the number of members in the object.
1191
+ SizeType MemberCount() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size; }
1192
+
1193
+ //! Get the capacity of object.
1194
+ SizeType MemberCapacity() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.capacity; }
1195
+
1196
+ //! Check whether the object is empty.
1197
+ bool ObjectEmpty() const { RAPIDJSON_ASSERT(IsObject()); return data_.o.size == 0; }
1198
+
1199
+ //! Get a value from an object associated with the name.
1200
+ /*! \pre IsObject() == true
1201
+ \tparam T Either \c Ch or \c const \c Ch (template used for disambiguation with \ref operator[](SizeType))
1202
+ \note In version 0.1x, if the member is not found, this function returns a null value. This makes issue 7.
1203
+ Since 0.2, if the name is not correct, it will assert.
1204
+ If user is unsure whether a member exists, user should use HasMember() first.
1205
+ A better approach is to use FindMember().
1206
+ \note Linear time complexity.
1207
+ */
1208
+ template <typename T>
1209
+ RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(GenericValue&)) operator[](T* name) {
1210
+ GenericValue n(StringRef(name));
1211
+ return (*this)[n];
1212
+ }
1213
+ template <typename T>
1214
+ RAPIDJSON_DISABLEIF_RETURN((internal::NotExpr<internal::IsSame<typename internal::RemoveConst<T>::Type, Ch> >),(const GenericValue&)) operator[](T* name) const { return const_cast<GenericValue&>(*this)[name]; }
1215
+
1216
+ //! Get a value from an object associated with the name.
1217
+ /*! \pre IsObject() == true
1218
+ \tparam SourceAllocator Allocator of the \c name value
1219
+
1220
+ \note Compared to \ref operator[](T*), this version is faster because it does not need a StrLen().
1221
+ And it can also handle strings with embedded null characters.
1222
+
1223
+ \note Linear time complexity.
1224
+ */
1225
+ template <typename SourceAllocator>
1226
+ GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) {
1227
+ MemberIterator member = FindMember(name);
1228
+ if (member != MemberEnd())
1229
+ return member->value;
1230
+ else {
1231
+ RAPIDJSON_ASSERT(false); // see above note
1232
+
1233
+ // This will generate -Wexit-time-destructors in clang
1234
+ // static GenericValue NullValue;
1235
+ // return NullValue;
1236
+
1237
+ // Use static buffer and placement-new to prevent destruction
1238
+ static char buffer[sizeof(GenericValue)];
1239
+ return *new (buffer) GenericValue();
1240
+ }
1241
+ }
1242
+ template <typename SourceAllocator>
1243
+ const GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this)[name]; }
1244
+
1245
+ #if RAPIDJSON_HAS_STDSTRING
1246
+ //! Get a value from an object associated with name (string object).
1247
+ GenericValue& operator[](const std::basic_string<Ch>& name) { return (*this)[GenericValue(StringRef(name))]; }
1248
+ const GenericValue& operator[](const std::basic_string<Ch>& name) const { return (*this)[GenericValue(StringRef(name))]; }
1249
+ #endif
1250
+
1251
+ //! Const member iterator
1252
+ /*! \pre IsObject() == true */
1253
+ ConstMemberIterator MemberBegin() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer()); }
1254
+ //! Const \em past-the-end member iterator
1255
+ /*! \pre IsObject() == true */
1256
+ ConstMemberIterator MemberEnd() const { RAPIDJSON_ASSERT(IsObject()); return ConstMemberIterator(GetMembersPointer() + data_.o.size); }
1257
+ //! Member iterator
1258
+ /*! \pre IsObject() == true */
1259
+ MemberIterator MemberBegin() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer()); }
1260
+ //! \em Past-the-end member iterator
1261
+ /*! \pre IsObject() == true */
1262
+ MemberIterator MemberEnd() { RAPIDJSON_ASSERT(IsObject()); return MemberIterator(GetMembersPointer() + data_.o.size); }
1263
+
1264
+ //! Request the object to have enough capacity to store members.
1265
+ /*! \param newCapacity The capacity that the object at least need to have.
1266
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1267
+ \return The value itself for fluent API.
1268
+ \note Linear time complexity.
1269
+ */
1270
+ GenericValue& MemberReserve(SizeType newCapacity, Allocator &allocator) {
1271
+ RAPIDJSON_ASSERT(IsObject());
1272
+ DoReserveMembers(newCapacity, allocator);
1273
+ return *this;
1274
+ }
1275
+
1276
+ //! Check whether a member exists in the object.
1277
+ /*!
1278
+ \param name Member name to be searched.
1279
+ \pre IsObject() == true
1280
+ \return Whether a member with that name exists.
1281
+ \note It is better to use FindMember() directly if you need the obtain the value as well.
1282
+ \note Linear time complexity.
1283
+ */
1284
+ bool HasMember(const Ch* name) const { return FindMember(name) != MemberEnd(); }
1285
+
1286
+ #if RAPIDJSON_HAS_STDSTRING
1287
+ //! Check whether a member exists in the object with string object.
1288
+ /*!
1289
+ \param name Member name to be searched.
1290
+ \pre IsObject() == true
1291
+ \return Whether a member with that name exists.
1292
+ \note It is better to use FindMember() directly if you need the obtain the value as well.
1293
+ \note Linear time complexity.
1294
+ */
1295
+ bool HasMember(const std::basic_string<Ch>& name) const { return FindMember(name) != MemberEnd(); }
1296
+ #endif
1297
+
1298
+ //! Check whether a member exists in the object with GenericValue name.
1299
+ /*!
1300
+ This version is faster because it does not need a StrLen(). It can also handle string with null character.
1301
+ \param name Member name to be searched.
1302
+ \pre IsObject() == true
1303
+ \return Whether a member with that name exists.
1304
+ \note It is better to use FindMember() directly if you need the obtain the value as well.
1305
+ \note Linear time complexity.
1306
+ */
1307
+ template <typename SourceAllocator>
1308
+ bool HasMember(const GenericValue<Encoding, SourceAllocator>& name) const { return FindMember(name) != MemberEnd(); }
1309
+
1310
+ //! Find member by name.
1311
+ /*!
1312
+ \param name Member name to be searched.
1313
+ \pre IsObject() == true
1314
+ \return Iterator to member, if it exists.
1315
+ Otherwise returns \ref MemberEnd().
1316
+
1317
+ \note Earlier versions of Rapidjson returned a \c NULL pointer, in case
1318
+ the requested member doesn't exist. For consistency with e.g.
1319
+ \c std::map, this has been changed to MemberEnd() now.
1320
+ \note Linear time complexity.
1321
+ */
1322
+ MemberIterator FindMember(const Ch* name) {
1323
+ GenericValue n(StringRef(name));
1324
+ return FindMember(n);
1325
+ }
1326
+
1327
+ ConstMemberIterator FindMember(const Ch* name) const { return const_cast<GenericValue&>(*this).FindMember(name); }
1328
+
1329
+ //! Find member by name.
1330
+ /*!
1331
+ This version is faster because it does not need a StrLen(). It can also handle string with null character.
1332
+ \param name Member name to be searched.
1333
+ \pre IsObject() == true
1334
+ \return Iterator to member, if it exists.
1335
+ Otherwise returns \ref MemberEnd().
1336
+
1337
+ \note Earlier versions of Rapidjson returned a \c NULL pointer, in case
1338
+ the requested member doesn't exist. For consistency with e.g.
1339
+ \c std::map, this has been changed to MemberEnd() now.
1340
+ \note Linear time complexity.
1341
+ */
1342
+ template <typename SourceAllocator>
1343
+ MemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) {
1344
+ RAPIDJSON_ASSERT(IsObject());
1345
+ RAPIDJSON_ASSERT(name.IsString());
1346
+ return DoFindMember(name);
1347
+ }
1348
+ template <typename SourceAllocator> ConstMemberIterator FindMember(const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this).FindMember(name); }
1349
+
1350
+ #if RAPIDJSON_HAS_STDSTRING
1351
+ //! Find member by string object name.
1352
+ /*!
1353
+ \param name Member name to be searched.
1354
+ \pre IsObject() == true
1355
+ \return Iterator to member, if it exists.
1356
+ Otherwise returns \ref MemberEnd().
1357
+ */
1358
+ MemberIterator FindMember(const std::basic_string<Ch>& name) { return FindMember(GenericValue(StringRef(name))); }
1359
+ ConstMemberIterator FindMember(const std::basic_string<Ch>& name) const { return FindMember(GenericValue(StringRef(name))); }
1360
+ #endif
1361
+
1362
+ //! Add a member (name-value pair) to the object.
1363
+ /*! \param name A string value as name of member.
1364
+ \param value Value of any type.
1365
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1366
+ \return The value itself for fluent API.
1367
+ \note The ownership of \c name and \c value will be transferred to this object on success.
1368
+ \pre IsObject() && name.IsString()
1369
+ \post name.IsNull() && value.IsNull()
1370
+ \note Amortized Constant time complexity.
1371
+ */
1372
+ GenericValue& AddMember(GenericValue& name, GenericValue& value, Allocator& allocator) {
1373
+ RAPIDJSON_ASSERT(IsObject());
1374
+ RAPIDJSON_ASSERT(name.IsString());
1375
+ DoAddMember(name, value, allocator);
1376
+ return *this;
1377
+ }
1378
+
1379
+ //! Add a constant string value as member (name-value pair) to the object.
1380
+ /*! \param name A string value as name of member.
1381
+ \param value constant string reference as value of member.
1382
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1383
+ \return The value itself for fluent API.
1384
+ \pre IsObject()
1385
+ \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below.
1386
+ \note Amortized Constant time complexity.
1387
+ */
1388
+ GenericValue& AddMember(GenericValue& name, StringRefType value, Allocator& allocator) {
1389
+ GenericValue v(value);
1390
+ return AddMember(name, v, allocator);
1391
+ }
1392
+
1393
+ #if RAPIDJSON_HAS_STDSTRING
1394
+ //! Add a string object as member (name-value pair) to the object.
1395
+ /*! \param name A string value as name of member.
1396
+ \param value constant string reference as value of member.
1397
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1398
+ \return The value itself for fluent API.
1399
+ \pre IsObject()
1400
+ \note This overload is needed to avoid clashes with the generic primitive type AddMember(GenericValue&,T,Allocator&) overload below.
1401
+ \note Amortized Constant time complexity.
1402
+ */
1403
+ GenericValue& AddMember(GenericValue& name, std::basic_string<Ch>& value, Allocator& allocator) {
1404
+ GenericValue v(value, allocator);
1405
+ return AddMember(name, v, allocator);
1406
+ }
1407
+ #endif
1408
+
1409
+ //! Add any primitive value as member (name-value pair) to the object.
1410
+ /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
1411
+ \param name A string value as name of member.
1412
+ \param value Value of primitive type \c T as value of member
1413
+ \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator().
1414
+ \return The value itself for fluent API.
1415
+ \pre IsObject()
1416
+
1417
+ \note The source type \c T explicitly disallows all pointer types,
1418
+ especially (\c const) \ref Ch*. This helps avoiding implicitly
1419
+ referencing character strings with insufficient lifetime, use
1420
+ \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref
1421
+ AddMember(StringRefType, StringRefType, Allocator&).
1422
+ All other pointer types would implicitly convert to \c bool,
1423
+ use an explicit cast instead, if needed.
1424
+ \note Amortized Constant time complexity.
1425
+ */
1426
+ template <typename T>
1427
+ RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1428
+ AddMember(GenericValue& name, T value, Allocator& allocator) {
1429
+ GenericValue v(value);
1430
+ return AddMember(name, v, allocator);
1431
+ }
1432
+
1433
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1434
+ GenericValue& AddMember(GenericValue&& name, GenericValue&& value, Allocator& allocator) {
1435
+ return AddMember(name, value, allocator);
1436
+ }
1437
+ GenericValue& AddMember(GenericValue&& name, GenericValue& value, Allocator& allocator) {
1438
+ return AddMember(name, value, allocator);
1439
+ }
1440
+ GenericValue& AddMember(GenericValue& name, GenericValue&& value, Allocator& allocator) {
1441
+ return AddMember(name, value, allocator);
1442
+ }
1443
+ GenericValue& AddMember(StringRefType name, GenericValue&& value, Allocator& allocator) {
1444
+ GenericValue n(name);
1445
+ return AddMember(n, value, allocator);
1446
+ }
1447
+ #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1448
+
1449
+
1450
+ //! Add a member (name-value pair) to the object.
1451
+ /*! \param name A constant string reference as name of member.
1452
+ \param value Value of any type.
1453
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1454
+ \return The value itself for fluent API.
1455
+ \note The ownership of \c value will be transferred to this object on success.
1456
+ \pre IsObject()
1457
+ \post value.IsNull()
1458
+ \note Amortized Constant time complexity.
1459
+ */
1460
+ GenericValue& AddMember(StringRefType name, GenericValue& value, Allocator& allocator) {
1461
+ GenericValue n(name);
1462
+ return AddMember(n, value, allocator);
1463
+ }
1464
+
1465
+ //! Add a constant string value as member (name-value pair) to the object.
1466
+ /*! \param name A constant string reference as name of member.
1467
+ \param value constant string reference as value of member.
1468
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1469
+ \return The value itself for fluent API.
1470
+ \pre IsObject()
1471
+ \note This overload is needed to avoid clashes with the generic primitive type AddMember(StringRefType,T,Allocator&) overload below.
1472
+ \note Amortized Constant time complexity.
1473
+ */
1474
+ GenericValue& AddMember(StringRefType name, StringRefType value, Allocator& allocator) {
1475
+ GenericValue v(value);
1476
+ return AddMember(name, v, allocator);
1477
+ }
1478
+
1479
+ //! Add any primitive value as member (name-value pair) to the object.
1480
+ /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
1481
+ \param name A constant string reference as name of member.
1482
+ \param value Value of primitive type \c T as value of member
1483
+ \param allocator Allocator for reallocating memory. Commonly use GenericDocument::GetAllocator().
1484
+ \return The value itself for fluent API.
1485
+ \pre IsObject()
1486
+
1487
+ \note The source type \c T explicitly disallows all pointer types,
1488
+ especially (\c const) \ref Ch*. This helps avoiding implicitly
1489
+ referencing character strings with insufficient lifetime, use
1490
+ \ref AddMember(StringRefType, GenericValue&, Allocator&) or \ref
1491
+ AddMember(StringRefType, StringRefType, Allocator&).
1492
+ All other pointer types would implicitly convert to \c bool,
1493
+ use an explicit cast instead, if needed.
1494
+ \note Amortized Constant time complexity.
1495
+ */
1496
+ template <typename T>
1497
+ RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1498
+ AddMember(StringRefType name, T value, Allocator& allocator) {
1499
+ GenericValue n(name);
1500
+ return AddMember(n, value, allocator);
1501
+ }
1502
+
1503
+ //! Remove all members in the object.
1504
+ /*! This function do not deallocate memory in the object, i.e. the capacity is unchanged.
1505
+ \note Linear time complexity.
1506
+ */
1507
+ void RemoveAllMembers() {
1508
+ RAPIDJSON_ASSERT(IsObject());
1509
+ DoClearMembers();
1510
+ }
1511
+
1512
+ //! Remove a member in object by its name.
1513
+ /*! \param name Name of member to be removed.
1514
+ \return Whether the member existed.
1515
+ \note This function may reorder the object members. Use \ref
1516
+ EraseMember(ConstMemberIterator) if you need to preserve the
1517
+ relative order of the remaining members.
1518
+ \note Linear time complexity.
1519
+ */
1520
+ bool RemoveMember(const Ch* name) {
1521
+ GenericValue n(StringRef(name));
1522
+ return RemoveMember(n);
1523
+ }
1524
+
1525
+ #if RAPIDJSON_HAS_STDSTRING
1526
+ bool RemoveMember(const std::basic_string<Ch>& name) { return RemoveMember(GenericValue(StringRef(name))); }
1527
+ #endif
1528
+
1529
+ template <typename SourceAllocator>
1530
+ bool RemoveMember(const GenericValue<Encoding, SourceAllocator>& name) {
1531
+ MemberIterator m = FindMember(name);
1532
+ if (m != MemberEnd()) {
1533
+ RemoveMember(m);
1534
+ return true;
1535
+ }
1536
+ else
1537
+ return false;
1538
+ }
1539
+
1540
+ //! Remove a member in object by iterator.
1541
+ /*! \param m member iterator (obtained by FindMember() or MemberBegin()).
1542
+ \return the new iterator after removal.
1543
+ \note This function may reorder the object members. Use \ref
1544
+ EraseMember(ConstMemberIterator) if you need to preserve the
1545
+ relative order of the remaining members.
1546
+ \note Constant time complexity.
1547
+ */
1548
+ MemberIterator RemoveMember(MemberIterator m) {
1549
+ RAPIDJSON_ASSERT(IsObject());
1550
+ RAPIDJSON_ASSERT(data_.o.size > 0);
1551
+ RAPIDJSON_ASSERT(GetMembersPointer() != 0);
1552
+ RAPIDJSON_ASSERT(m >= MemberBegin() && m < MemberEnd());
1553
+ return DoRemoveMember(m);
1554
+ }
1555
+
1556
+ //! Remove a member from an object by iterator.
1557
+ /*! \param pos iterator to the member to remove
1558
+ \pre IsObject() == true && \ref MemberBegin() <= \c pos < \ref MemberEnd()
1559
+ \return Iterator following the removed element.
1560
+ If the iterator \c pos refers to the last element, the \ref MemberEnd() iterator is returned.
1561
+ \note This function preserves the relative order of the remaining object
1562
+ members. If you do not need this, use the more efficient \ref RemoveMember(MemberIterator).
1563
+ \note Linear time complexity.
1564
+ */
1565
+ MemberIterator EraseMember(ConstMemberIterator pos) {
1566
+ return EraseMember(pos, pos +1);
1567
+ }
1568
+
1569
+ //! Remove members in the range [first, last) from an object.
1570
+ /*! \param first iterator to the first member to remove
1571
+ \param last iterator following the last member to remove
1572
+ \pre IsObject() == true && \ref MemberBegin() <= \c first <= \c last <= \ref MemberEnd()
1573
+ \return Iterator following the last removed element.
1574
+ \note This function preserves the relative order of the remaining object
1575
+ members.
1576
+ \note Linear time complexity.
1577
+ */
1578
+ MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) {
1579
+ RAPIDJSON_ASSERT(IsObject());
1580
+ RAPIDJSON_ASSERT(data_.o.size > 0);
1581
+ RAPIDJSON_ASSERT(GetMembersPointer() != 0);
1582
+ RAPIDJSON_ASSERT(first >= MemberBegin());
1583
+ RAPIDJSON_ASSERT(first <= last);
1584
+ RAPIDJSON_ASSERT(last <= MemberEnd());
1585
+ return DoEraseMembers(first, last);
1586
+ }
1587
+
1588
+ //! Erase a member in object by its name.
1589
+ /*! \param name Name of member to be removed.
1590
+ \return Whether the member existed.
1591
+ \note Linear time complexity.
1592
+ */
1593
+ bool EraseMember(const Ch* name) {
1594
+ GenericValue n(StringRef(name));
1595
+ return EraseMember(n);
1596
+ }
1597
+
1598
+ #if RAPIDJSON_HAS_STDSTRING
1599
+ bool EraseMember(const std::basic_string<Ch>& name) { return EraseMember(GenericValue(StringRef(name))); }
1600
+ #endif
1601
+
1602
+ template <typename SourceAllocator>
1603
+ bool EraseMember(const GenericValue<Encoding, SourceAllocator>& name) {
1604
+ MemberIterator m = FindMember(name);
1605
+ if (m != MemberEnd()) {
1606
+ EraseMember(m);
1607
+ return true;
1608
+ }
1609
+ else
1610
+ return false;
1611
+ }
1612
+
1613
+ Object GetObject() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); }
1614
+ Object GetObj() { RAPIDJSON_ASSERT(IsObject()); return Object(*this); }
1615
+ ConstObject GetObject() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); }
1616
+ ConstObject GetObj() const { RAPIDJSON_ASSERT(IsObject()); return ConstObject(*this); }
1617
+
1618
+ //@}
1619
+
1620
+ //!@name Array
1621
+ //@{
1622
+
1623
+ //! Set this value as an empty array.
1624
+ /*! \post IsArray == true */
1625
+ GenericValue& SetArray() { this->~GenericValue(); new (this) GenericValue(kArrayType); return *this; }
1626
+
1627
+ //! Get the number of elements in array.
1628
+ SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }
1629
+
1630
+ //! Get the capacity of array.
1631
+ SizeType Capacity() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.capacity; }
1632
+
1633
+ //! Check whether the array is empty.
1634
+ bool Empty() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size == 0; }
1635
+
1636
+ //! Remove all elements in the array.
1637
+ /*! This function do not deallocate memory in the array, i.e. the capacity is unchanged.
1638
+ \note Linear time complexity.
1639
+ */
1640
+ void Clear() {
1641
+ RAPIDJSON_ASSERT(IsArray());
1642
+ GenericValue* e = GetElementsPointer();
1643
+ for (GenericValue* v = e; v != e + data_.a.size; ++v)
1644
+ v->~GenericValue();
1645
+ data_.a.size = 0;
1646
+ }
1647
+
1648
+ //! Get an element from array by index.
1649
+ /*! \pre IsArray() == true
1650
+ \param index Zero-based index of element.
1651
+ \see operator[](T*)
1652
+ */
1653
+ GenericValue& operator[](SizeType index) {
1654
+ RAPIDJSON_ASSERT(IsArray());
1655
+ RAPIDJSON_ASSERT(index < data_.a.size);
1656
+ return GetElementsPointer()[index];
1657
+ }
1658
+ const GenericValue& operator[](SizeType index) const { return const_cast<GenericValue&>(*this)[index]; }
1659
+
1660
+ //! Element iterator
1661
+ /*! \pre IsArray() == true */
1662
+ ValueIterator Begin() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer(); }
1663
+ //! \em Past-the-end element iterator
1664
+ /*! \pre IsArray() == true */
1665
+ ValueIterator End() { RAPIDJSON_ASSERT(IsArray()); return GetElementsPointer() + data_.a.size; }
1666
+ //! Constant element iterator
1667
+ /*! \pre IsArray() == true */
1668
+ ConstValueIterator Begin() const { return const_cast<GenericValue&>(*this).Begin(); }
1669
+ //! Constant \em past-the-end element iterator
1670
+ /*! \pre IsArray() == true */
1671
+ ConstValueIterator End() const { return const_cast<GenericValue&>(*this).End(); }
1672
+
1673
+ //! Request the array to have enough capacity to store elements.
1674
+ /*! \param newCapacity The capacity that the array at least need to have.
1675
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1676
+ \return The value itself for fluent API.
1677
+ \note Linear time complexity.
1678
+ */
1679
+ GenericValue& Reserve(SizeType newCapacity, Allocator &allocator) {
1680
+ RAPIDJSON_ASSERT(IsArray());
1681
+ if (newCapacity > data_.a.capacity) {
1682
+ SetElementsPointer(reinterpret_cast<GenericValue*>(allocator.Realloc(GetElementsPointer(), data_.a.capacity * sizeof(GenericValue), newCapacity * sizeof(GenericValue))));
1683
+ data_.a.capacity = newCapacity;
1684
+ }
1685
+ return *this;
1686
+ }
1687
+
1688
+ //! Append a GenericValue at the end of the array.
1689
+ /*! \param value Value to be appended.
1690
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1691
+ \pre IsArray() == true
1692
+ \post value.IsNull() == true
1693
+ \return The value itself for fluent API.
1694
+ \note The ownership of \c value will be transferred to this array on success.
1695
+ \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
1696
+ \note Amortized constant time complexity.
1697
+ */
1698
+ GenericValue& PushBack(GenericValue& value, Allocator& allocator) {
1699
+ RAPIDJSON_ASSERT(IsArray());
1700
+ if (data_.a.size >= data_.a.capacity)
1701
+ Reserve(data_.a.capacity == 0 ? kDefaultArrayCapacity : (data_.a.capacity + (data_.a.capacity + 1) / 2), allocator);
1702
+ GetElementsPointer()[data_.a.size++].RawAssign(value);
1703
+ return *this;
1704
+ }
1705
+
1706
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
1707
+ GenericValue& PushBack(GenericValue&& value, Allocator& allocator) {
1708
+ return PushBack(value, allocator);
1709
+ }
1710
+ #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
1711
+
1712
+ //! Append a constant string reference at the end of the array.
1713
+ /*! \param value Constant string reference to be appended.
1714
+ \param allocator Allocator for reallocating memory. It must be the same one used previously. Commonly use GenericDocument::GetAllocator().
1715
+ \pre IsArray() == true
1716
+ \return The value itself for fluent API.
1717
+ \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
1718
+ \note Amortized constant time complexity.
1719
+ \see GenericStringRef
1720
+ */
1721
+ GenericValue& PushBack(StringRefType value, Allocator& allocator) {
1722
+ return (*this).template PushBack<StringRefType>(value, allocator);
1723
+ }
1724
+
1725
+ //! Append a primitive value at the end of the array.
1726
+ /*! \tparam T Either \ref Type, \c int, \c unsigned, \c int64_t, \c uint64_t
1727
+ \param value Value of primitive type T to be appended.
1728
+ \param allocator Allocator for reallocating memory. It must be the same one as used before. Commonly use GenericDocument::GetAllocator().
1729
+ \pre IsArray() == true
1730
+ \return The value itself for fluent API.
1731
+ \note If the number of elements to be appended is known, calls Reserve() once first may be more efficient.
1732
+
1733
+ \note The source type \c T explicitly disallows all pointer types,
1734
+ especially (\c const) \ref Ch*. This helps avoiding implicitly
1735
+ referencing character strings with insufficient lifetime, use
1736
+ \ref PushBack(GenericValue&, Allocator&) or \ref
1737
+ PushBack(StringRefType, Allocator&).
1738
+ All other pointer types would implicitly convert to \c bool,
1739
+ use an explicit cast instead, if needed.
1740
+ \note Amortized constant time complexity.
1741
+ */
1742
+ template <typename T>
1743
+ RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericValue&))
1744
+ PushBack(T value, Allocator& allocator) {
1745
+ GenericValue v(value);
1746
+ return PushBack(v, allocator);
1747
+ }
1748
+
1749
+ //! Remove the last element in the array.
1750
+ /*!
1751
+ \note Constant time complexity.
1752
+ */
1753
+ GenericValue& PopBack() {
1754
+ RAPIDJSON_ASSERT(IsArray());
1755
+ RAPIDJSON_ASSERT(!Empty());
1756
+ GetElementsPointer()[--data_.a.size].~GenericValue();
1757
+ return *this;
1758
+ }
1759
+
1760
+ //! Remove an element of array by iterator.
1761
+ /*!
1762
+ \param pos iterator to the element to remove
1763
+ \pre IsArray() == true && \ref Begin() <= \c pos < \ref End()
1764
+ \return Iterator following the removed element. If the iterator pos refers to the last element, the End() iterator is returned.
1765
+ \note Linear time complexity.
1766
+ */
1767
+ ValueIterator Erase(ConstValueIterator pos) {
1768
+ return Erase(pos, pos + 1);
1769
+ }
1770
+
1771
+ //! Remove elements in the range [first, last) of the array.
1772
+ /*!
1773
+ \param first iterator to the first element to remove
1774
+ \param last iterator following the last element to remove
1775
+ \pre IsArray() == true && \ref Begin() <= \c first <= \c last <= \ref End()
1776
+ \return Iterator following the last removed element.
1777
+ \note Linear time complexity.
1778
+ */
1779
+ ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) {
1780
+ RAPIDJSON_ASSERT(IsArray());
1781
+ RAPIDJSON_ASSERT(data_.a.size > 0);
1782
+ RAPIDJSON_ASSERT(GetElementsPointer() != 0);
1783
+ RAPIDJSON_ASSERT(first >= Begin());
1784
+ RAPIDJSON_ASSERT(first <= last);
1785
+ RAPIDJSON_ASSERT(last <= End());
1786
+ ValueIterator pos = Begin() + (first - Begin());
1787
+ for (ValueIterator itr = pos; itr != last; ++itr)
1788
+ itr->~GenericValue();
1789
+ std::memmove(static_cast<void*>(pos), last, static_cast<size_t>(End() - last) * sizeof(GenericValue));
1790
+ data_.a.size -= static_cast<SizeType>(last - first);
1791
+ return pos;
1792
+ }
1793
+
1794
+ Array GetArray() { RAPIDJSON_ASSERT(IsArray()); return Array(*this); }
1795
+ ConstArray GetArray() const { RAPIDJSON_ASSERT(IsArray()); return ConstArray(*this); }
1796
+
1797
+ //@}
1798
+
1799
+ //!@name Number
1800
+ //@{
1801
+
1802
+ int GetInt() const { RAPIDJSON_ASSERT(data_.f.flags & kIntFlag); return data_.n.i.i; }
1803
+ unsigned GetUint() const { RAPIDJSON_ASSERT(data_.f.flags & kUintFlag); return data_.n.u.u; }
1804
+ int64_t GetInt64() const { RAPIDJSON_ASSERT(data_.f.flags & kInt64Flag); return data_.n.i64; }
1805
+ uint64_t GetUint64() const { RAPIDJSON_ASSERT(data_.f.flags & kUint64Flag); return data_.n.u64; }
1806
+
1807
+ //! Get the value as double type.
1808
+ /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessDouble() to check whether the converison is lossless.
1809
+ */
1810
+ double GetDouble() const {
1811
+ RAPIDJSON_ASSERT(IsNumber());
1812
+ if ((data_.f.flags & kDoubleFlag) != 0) return data_.n.d; // exact type, no conversion.
1813
+ if ((data_.f.flags & kIntFlag) != 0) return data_.n.i.i; // int -> double
1814
+ if ((data_.f.flags & kUintFlag) != 0) return data_.n.u.u; // unsigned -> double
1815
+ if ((data_.f.flags & kInt64Flag) != 0) return static_cast<double>(data_.n.i64); // int64_t -> double (may lose precision)
1816
+ RAPIDJSON_ASSERT((data_.f.flags & kUint64Flag) != 0); return static_cast<double>(data_.n.u64); // uint64_t -> double (may lose precision)
1817
+ }
1818
+
1819
+ //! Get the value as float type.
1820
+ /*! \note If the value is 64-bit integer type, it may lose precision. Use \c IsLosslessFloat() to check whether the converison is lossless.
1821
+ */
1822
+ float GetFloat() const {
1823
+ return static_cast<float>(GetDouble());
1824
+ }
1825
+
1826
+ GenericValue& SetInt(int i) { this->~GenericValue(); new (this) GenericValue(i); return *this; }
1827
+ GenericValue& SetUint(unsigned u) { this->~GenericValue(); new (this) GenericValue(u); return *this; }
1828
+ GenericValue& SetInt64(int64_t i64) { this->~GenericValue(); new (this) GenericValue(i64); return *this; }
1829
+ GenericValue& SetUint64(uint64_t u64) { this->~GenericValue(); new (this) GenericValue(u64); return *this; }
1830
+ GenericValue& SetDouble(double d) { this->~GenericValue(); new (this) GenericValue(d); return *this; }
1831
+ GenericValue& SetFloat(float f) { this->~GenericValue(); new (this) GenericValue(static_cast<double>(f)); return *this; }
1832
+
1833
+ //@}
1834
+
1835
+ //!@name String
1836
+ //@{
1837
+
1838
+ const Ch* GetString() const { RAPIDJSON_ASSERT(IsString()); return DataString(data_); }
1839
+
1840
+ //! Get the length of string.
1841
+ /*! Since rapidjson permits "\\u0000" in the json string, strlen(v.GetString()) may not equal to v.GetStringLength().
1842
+ */
1843
+ SizeType GetStringLength() const { RAPIDJSON_ASSERT(IsString()); return DataStringLength(data_); }
1844
+
1845
+ //! Set this value as a string without copying source string.
1846
+ /*! This version has better performance with supplied length, and also support string containing null character.
1847
+ \param s source string pointer.
1848
+ \param length The length of source string, excluding the trailing null terminator.
1849
+ \return The value itself for fluent API.
1850
+ \post IsString() == true && GetString() == s && GetStringLength() == length
1851
+ \see SetString(StringRefType)
1852
+ */
1853
+ GenericValue& SetString(const Ch* s, SizeType length) { return SetString(StringRef(s, length)); }
1854
+
1855
+ //! Set this value as a string without copying source string.
1856
+ /*! \param s source string reference
1857
+ \return The value itself for fluent API.
1858
+ \post IsString() == true && GetString() == s && GetStringLength() == s.length
1859
+ */
1860
+ GenericValue& SetString(StringRefType s) { this->~GenericValue(); SetStringRaw(s); return *this; }
1861
+
1862
+ //! Set this value as a string by copying from source string.
1863
+ /*! This version has better performance with supplied length, and also support string containing null character.
1864
+ \param s source string.
1865
+ \param length The length of source string, excluding the trailing null terminator.
1866
+ \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1867
+ \return The value itself for fluent API.
1868
+ \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length
1869
+ */
1870
+ GenericValue& SetString(const Ch* s, SizeType length, Allocator& allocator) { return SetString(StringRef(s, length), allocator); }
1871
+
1872
+ //! Set this value as a string by copying from source string.
1873
+ /*! \param s source string.
1874
+ \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1875
+ \return The value itself for fluent API.
1876
+ \post IsString() == true && GetString() != s && strcmp(GetString(),s) == 0 && GetStringLength() == length
1877
+ */
1878
+ GenericValue& SetString(const Ch* s, Allocator& allocator) { return SetString(StringRef(s), allocator); }
1879
+
1880
+ //! Set this value as a string by copying from source string.
1881
+ /*! \param s source string reference
1882
+ \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1883
+ \return The value itself for fluent API.
1884
+ \post IsString() == true && GetString() != s.s && strcmp(GetString(),s) == 0 && GetStringLength() == length
1885
+ */
1886
+ GenericValue& SetString(StringRefType s, Allocator& allocator) { this->~GenericValue(); SetStringRaw(s, allocator); return *this; }
1887
+
1888
+ #if RAPIDJSON_HAS_STDSTRING
1889
+ //! Set this value as a string by copying from source string.
1890
+ /*! \param s source string.
1891
+ \param allocator Allocator for allocating copied buffer. Commonly use GenericDocument::GetAllocator().
1892
+ \return The value itself for fluent API.
1893
+ \post IsString() == true && GetString() != s.data() && strcmp(GetString(),s.data() == 0 && GetStringLength() == s.size()
1894
+ \note Requires the definition of the preprocessor symbol \ref RAPIDJSON_HAS_STDSTRING.
1895
+ */
1896
+ GenericValue& SetString(const std::basic_string<Ch>& s, Allocator& allocator) { return SetString(StringRef(s), allocator); }
1897
+ #endif
1898
+
1899
+ //@}
1900
+
1901
+ //!@name Array
1902
+ //@{
1903
+
1904
+ //! Templated version for checking whether this value is type T.
1905
+ /*!
1906
+ \tparam T Either \c bool, \c int, \c unsigned, \c int64_t, \c uint64_t, \c double, \c float, \c const \c char*, \c std::basic_string<Ch>
1907
+ */
1908
+ template <typename T>
1909
+ bool Is() const { return internal::TypeHelper<ValueType, T>::Is(*this); }
1910
+
1911
+ template <typename T>
1912
+ T Get() const { return internal::TypeHelper<ValueType, T>::Get(*this); }
1913
+
1914
+ template <typename T>
1915
+ T Get() { return internal::TypeHelper<ValueType, T>::Get(*this); }
1916
+
1917
+ template<typename T>
1918
+ ValueType& Set(const T& data) { return internal::TypeHelper<ValueType, T>::Set(*this, data); }
1919
+
1920
+ template<typename T>
1921
+ ValueType& Set(const T& data, AllocatorType& allocator) { return internal::TypeHelper<ValueType, T>::Set(*this, data, allocator); }
1922
+
1923
+ //@}
1924
+
1925
+ //! Generate events of this value to a Handler.
1926
+ /*! This function adopts the GoF visitor pattern.
1927
+ Typical usage is to output this JSON value as JSON text via Writer, which is a Handler.
1928
+ It can also be used to deep clone this value via GenericDocument, which is also a Handler.
1929
+ \tparam Handler type of handler.
1930
+ \param handler An object implementing concept Handler.
1931
+ */
1932
+ template <typename Handler>
1933
+ bool Accept(Handler& handler) const {
1934
+ switch(GetType()) {
1935
+ case kNullType: return handler.Null();
1936
+ case kFalseType: return handler.Bool(false);
1937
+ case kTrueType: return handler.Bool(true);
1938
+
1939
+ case kObjectType:
1940
+ if (RAPIDJSON_UNLIKELY(!handler.StartObject()))
1941
+ return false;
1942
+ for (ConstMemberIterator m = MemberBegin(); m != MemberEnd(); ++m) {
1943
+ RAPIDJSON_ASSERT(m->name.IsString()); // User may change the type of name by MemberIterator.
1944
+ if (RAPIDJSON_UNLIKELY(!handler.Key(m->name.GetString(), m->name.GetStringLength(), (m->name.data_.f.flags & kCopyFlag) != 0)))
1945
+ return false;
1946
+ if (RAPIDJSON_UNLIKELY(!m->value.Accept(handler)))
1947
+ return false;
1948
+ }
1949
+ return handler.EndObject(data_.o.size);
1950
+
1951
+ case kArrayType:
1952
+ if (RAPIDJSON_UNLIKELY(!handler.StartArray()))
1953
+ return false;
1954
+ for (ConstValueIterator v = Begin(); v != End(); ++v)
1955
+ if (RAPIDJSON_UNLIKELY(!v->Accept(handler)))
1956
+ return false;
1957
+ return handler.EndArray(data_.a.size);
1958
+
1959
+ case kStringType:
1960
+ return handler.String(GetString(), GetStringLength(), (data_.f.flags & kCopyFlag) != 0);
1961
+
1962
+ default:
1963
+ RAPIDJSON_ASSERT(GetType() == kNumberType);
1964
+ if (IsDouble()) return handler.Double(data_.n.d);
1965
+ else if (IsInt()) return handler.Int(data_.n.i.i);
1966
+ else if (IsUint()) return handler.Uint(data_.n.u.u);
1967
+ else if (IsInt64()) return handler.Int64(data_.n.i64);
1968
+ else return handler.Uint64(data_.n.u64);
1969
+ }
1970
+ }
1971
+
1972
+ private:
1973
+ template <typename, typename> friend class GenericValue;
1974
+ template <typename, typename, typename> friend class GenericDocument;
1975
+
1976
+ enum {
1977
+ kBoolFlag = 0x0008,
1978
+ kNumberFlag = 0x0010,
1979
+ kIntFlag = 0x0020,
1980
+ kUintFlag = 0x0040,
1981
+ kInt64Flag = 0x0080,
1982
+ kUint64Flag = 0x0100,
1983
+ kDoubleFlag = 0x0200,
1984
+ kStringFlag = 0x0400,
1985
+ kCopyFlag = 0x0800,
1986
+ kInlineStrFlag = 0x1000,
1987
+
1988
+ // Initial flags of different types.
1989
+ kNullFlag = kNullType,
1990
+ // These casts are added to suppress the warning on MSVC about bitwise operations between enums of different types.
1991
+ kTrueFlag = static_cast<int>(kTrueType) | static_cast<int>(kBoolFlag),
1992
+ kFalseFlag = static_cast<int>(kFalseType) | static_cast<int>(kBoolFlag),
1993
+ kNumberIntFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kIntFlag | kInt64Flag),
1994
+ kNumberUintFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kUintFlag | kUint64Flag | kInt64Flag),
1995
+ kNumberInt64Flag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kInt64Flag),
1996
+ kNumberUint64Flag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kUint64Flag),
1997
+ kNumberDoubleFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kDoubleFlag),
1998
+ kNumberAnyFlag = static_cast<int>(kNumberType) | static_cast<int>(kNumberFlag | kIntFlag | kInt64Flag | kUintFlag | kUint64Flag | kDoubleFlag),
1999
+ kConstStringFlag = static_cast<int>(kStringType) | static_cast<int>(kStringFlag),
2000
+ kCopyStringFlag = static_cast<int>(kStringType) | static_cast<int>(kStringFlag | kCopyFlag),
2001
+ kShortStringFlag = static_cast<int>(kStringType) | static_cast<int>(kStringFlag | kCopyFlag | kInlineStrFlag),
2002
+ kObjectFlag = kObjectType,
2003
+ kArrayFlag = kArrayType,
2004
+
2005
+ kTypeMask = 0x07
2006
+ };
2007
+
2008
+ static const SizeType kDefaultArrayCapacity = RAPIDJSON_VALUE_DEFAULT_ARRAY_CAPACITY;
2009
+ static const SizeType kDefaultObjectCapacity = RAPIDJSON_VALUE_DEFAULT_OBJECT_CAPACITY;
2010
+
2011
+ struct Flag {
2012
+ #if RAPIDJSON_48BITPOINTER_OPTIMIZATION
2013
+ char payload[sizeof(SizeType) * 2 + 6]; // 2 x SizeType + lower 48-bit pointer
2014
+ #elif RAPIDJSON_64BIT
2015
+ char payload[sizeof(SizeType) * 2 + sizeof(void*) + 6]; // 6 padding bytes
2016
+ #else
2017
+ char payload[sizeof(SizeType) * 2 + sizeof(void*) + 2]; // 2 padding bytes
2018
+ #endif
2019
+ uint16_t flags;
2020
+ };
2021
+
2022
+ struct String {
2023
+ SizeType length;
2024
+ SizeType hashcode; //!< reserved
2025
+ const Ch* str;
2026
+ }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
2027
+
2028
+ // implementation detail: ShortString can represent zero-terminated strings up to MaxSize chars
2029
+ // (excluding the terminating zero) and store a value to determine the length of the contained
2030
+ // string in the last character str[LenPos] by storing "MaxSize - length" there. If the string
2031
+ // to store has the maximal length of MaxSize then str[LenPos] will be 0 and therefore act as
2032
+ // the string terminator as well. For getting the string length back from that value just use
2033
+ // "MaxSize - str[LenPos]".
2034
+ // This allows to store 13-chars strings in 32-bit mode, 21-chars strings in 64-bit mode,
2035
+ // 13-chars strings for RAPIDJSON_48BITPOINTER_OPTIMIZATION=1 inline (for `UTF8`-encoded strings).
2036
+ struct ShortString {
2037
+ enum { MaxChars = sizeof(static_cast<Flag*>(0)->payload) / sizeof(Ch), MaxSize = MaxChars - 1, LenPos = MaxSize };
2038
+ Ch str[MaxChars];
2039
+
2040
+ inline static bool Usable(SizeType len) { return (MaxSize >= len); }
2041
+ inline void SetLength(SizeType len) { str[LenPos] = static_cast<Ch>(MaxSize - len); }
2042
+ inline SizeType GetLength() const { return static_cast<SizeType>(MaxSize - str[LenPos]); }
2043
+ }; // at most as many bytes as "String" above => 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
2044
+
2045
+ // By using proper binary layout, retrieval of different integer types do not need conversions.
2046
+ union Number {
2047
+ #if RAPIDJSON_ENDIAN == RAPIDJSON_LITTLEENDIAN
2048
+ struct I {
2049
+ int i;
2050
+ char padding[4];
2051
+ }i;
2052
+ struct U {
2053
+ unsigned u;
2054
+ char padding2[4];
2055
+ }u;
2056
+ #else
2057
+ struct I {
2058
+ char padding[4];
2059
+ int i;
2060
+ }i;
2061
+ struct U {
2062
+ char padding2[4];
2063
+ unsigned u;
2064
+ }u;
2065
+ #endif
2066
+ int64_t i64;
2067
+ uint64_t u64;
2068
+ double d;
2069
+ }; // 8 bytes
2070
+
2071
+ struct ObjectData {
2072
+ SizeType size;
2073
+ SizeType capacity;
2074
+ Member* members;
2075
+ }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
2076
+
2077
+ struct ArrayData {
2078
+ SizeType size;
2079
+ SizeType capacity;
2080
+ GenericValue* elements;
2081
+ }; // 12 bytes in 32-bit mode, 16 bytes in 64-bit mode
2082
+
2083
+ union Data {
2084
+ String s;
2085
+ ShortString ss;
2086
+ Number n;
2087
+ ObjectData o;
2088
+ ArrayData a;
2089
+ Flag f;
2090
+ }; // 16 bytes in 32-bit mode, 24 bytes in 64-bit mode, 16 bytes in 64-bit with RAPIDJSON_48BITPOINTER_OPTIMIZATION
2091
+
2092
+ static RAPIDJSON_FORCEINLINE const Ch* DataString(const Data& data) {
2093
+ return (data.f.flags & kInlineStrFlag) ? data.ss.str : RAPIDJSON_GETPOINTER(Ch, data.s.str);
2094
+ }
2095
+ static RAPIDJSON_FORCEINLINE SizeType DataStringLength(const Data& data) {
2096
+ return (data.f.flags & kInlineStrFlag) ? data.ss.GetLength() : data.s.length;
2097
+ }
2098
+
2099
+ RAPIDJSON_FORCEINLINE const Ch* GetStringPointer() const { return RAPIDJSON_GETPOINTER(Ch, data_.s.str); }
2100
+ RAPIDJSON_FORCEINLINE const Ch* SetStringPointer(const Ch* str) { return RAPIDJSON_SETPOINTER(Ch, data_.s.str, str); }
2101
+ RAPIDJSON_FORCEINLINE GenericValue* GetElementsPointer() const { return RAPIDJSON_GETPOINTER(GenericValue, data_.a.elements); }
2102
+ RAPIDJSON_FORCEINLINE GenericValue* SetElementsPointer(GenericValue* elements) { return RAPIDJSON_SETPOINTER(GenericValue, data_.a.elements, elements); }
2103
+ RAPIDJSON_FORCEINLINE Member* GetMembersPointer() const { return RAPIDJSON_GETPOINTER(Member, data_.o.members); }
2104
+ RAPIDJSON_FORCEINLINE Member* SetMembersPointer(Member* members) { return RAPIDJSON_SETPOINTER(Member, data_.o.members, members); }
2105
+
2106
+ #if RAPIDJSON_USE_MEMBERSMAP
2107
+
2108
+ struct MapTraits {
2109
+ struct Less {
2110
+ bool operator()(const Data& s1, const Data& s2) const {
2111
+ SizeType n1 = DataStringLength(s1), n2 = DataStringLength(s2);
2112
+ int cmp = std::memcmp(DataString(s1), DataString(s2), sizeof(Ch) * (n1 < n2 ? n1 : n2));
2113
+ return cmp < 0 || (cmp == 0 && n1 < n2);
2114
+ }
2115
+ };
2116
+ typedef std::pair<const Data, SizeType> Pair;
2117
+ typedef std::multimap<Data, SizeType, Less, StdAllocator<Pair, Allocator> > Map;
2118
+ typedef typename Map::iterator Iterator;
2119
+ };
2120
+ typedef typename MapTraits::Map Map;
2121
+ typedef typename MapTraits::Less MapLess;
2122
+ typedef typename MapTraits::Pair MapPair;
2123
+ typedef typename MapTraits::Iterator MapIterator;
2124
+
2125
+ //
2126
+ // Layout of the members' map/array, re(al)located according to the needed capacity:
2127
+ //
2128
+ // {Map*}<>{capacity}<>{Member[capacity]}<>{MapIterator[capacity]}
2129
+ //
2130
+ // (where <> stands for the RAPIDJSON_ALIGN-ment, if needed)
2131
+ //
2132
+
2133
+ static RAPIDJSON_FORCEINLINE size_t GetMapLayoutSize(SizeType capacity) {
2134
+ return RAPIDJSON_ALIGN(sizeof(Map*)) +
2135
+ RAPIDJSON_ALIGN(sizeof(SizeType)) +
2136
+ RAPIDJSON_ALIGN(capacity * sizeof(Member)) +
2137
+ capacity * sizeof(MapIterator);
2138
+ }
2139
+
2140
+ static RAPIDJSON_FORCEINLINE SizeType &GetMapCapacity(Map* &map) {
2141
+ return *reinterpret_cast<SizeType*>(reinterpret_cast<uintptr_t>(&map) +
2142
+ RAPIDJSON_ALIGN(sizeof(Map*)));
2143
+ }
2144
+
2145
+ static RAPIDJSON_FORCEINLINE Member* GetMapMembers(Map* &map) {
2146
+ return reinterpret_cast<Member*>(reinterpret_cast<uintptr_t>(&map) +
2147
+ RAPIDJSON_ALIGN(sizeof(Map*)) +
2148
+ RAPIDJSON_ALIGN(sizeof(SizeType)));
2149
+ }
2150
+
2151
+ static RAPIDJSON_FORCEINLINE MapIterator* GetMapIterators(Map* &map) {
2152
+ return reinterpret_cast<MapIterator*>(reinterpret_cast<uintptr_t>(&map) +
2153
+ RAPIDJSON_ALIGN(sizeof(Map*)) +
2154
+ RAPIDJSON_ALIGN(sizeof(SizeType)) +
2155
+ RAPIDJSON_ALIGN(GetMapCapacity(map) * sizeof(Member)));
2156
+ }
2157
+
2158
+ static RAPIDJSON_FORCEINLINE Map* &GetMap(Member* members) {
2159
+ RAPIDJSON_ASSERT(members != 0);
2160
+ return *reinterpret_cast<Map**>(reinterpret_cast<uintptr_t>(members) -
2161
+ RAPIDJSON_ALIGN(sizeof(SizeType)) -
2162
+ RAPIDJSON_ALIGN(sizeof(Map*)));
2163
+ }
2164
+
2165
+ // Some compilers' debug mechanisms want all iterators to be destroyed, for their accounting..
2166
+ RAPIDJSON_FORCEINLINE MapIterator DropMapIterator(MapIterator& rhs) {
2167
+ #if RAPIDJSON_HAS_CXX11
2168
+ MapIterator ret = std::move(rhs);
2169
+ #else
2170
+ MapIterator ret = rhs;
2171
+ #endif
2172
+ rhs.~MapIterator();
2173
+ return ret;
2174
+ }
2175
+
2176
+ Map* &DoReallocMap(Map** oldMap, SizeType newCapacity, Allocator& allocator) {
2177
+ Map **newMap = static_cast<Map**>(allocator.Malloc(GetMapLayoutSize(newCapacity)));
2178
+ GetMapCapacity(*newMap) = newCapacity;
2179
+ if (!oldMap) {
2180
+ *newMap = new (allocator.Malloc(sizeof(Map))) Map(MapLess(), allocator);
2181
+ }
2182
+ else {
2183
+ *newMap = *oldMap;
2184
+ size_t count = (*oldMap)->size();
2185
+ std::memcpy(static_cast<void*>(GetMapMembers(*newMap)),
2186
+ static_cast<void*>(GetMapMembers(*oldMap)),
2187
+ count * sizeof(Member));
2188
+ MapIterator *oldIt = GetMapIterators(*oldMap),
2189
+ *newIt = GetMapIterators(*newMap);
2190
+ while (count--) {
2191
+ new (&newIt[count]) MapIterator(DropMapIterator(oldIt[count]));
2192
+ }
2193
+ Allocator::Free(oldMap);
2194
+ }
2195
+ return *newMap;
2196
+ }
2197
+
2198
+ RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) {
2199
+ return GetMapMembers(DoReallocMap(0, capacity, allocator));
2200
+ }
2201
+
2202
+ void DoReserveMembers(SizeType newCapacity, Allocator& allocator) {
2203
+ ObjectData& o = data_.o;
2204
+ if (newCapacity > o.capacity) {
2205
+ Member* oldMembers = GetMembersPointer();
2206
+ Map **oldMap = oldMembers ? &GetMap(oldMembers) : 0,
2207
+ *&newMap = DoReallocMap(oldMap, newCapacity, allocator);
2208
+ RAPIDJSON_SETPOINTER(Member, o.members, GetMapMembers(newMap));
2209
+ o.capacity = newCapacity;
2210
+ }
2211
+ }
2212
+
2213
+ template <typename SourceAllocator>
2214
+ MemberIterator DoFindMember(const GenericValue<Encoding, SourceAllocator>& name) {
2215
+ if (Member* members = GetMembersPointer()) {
2216
+ Map* &map = GetMap(members);
2217
+ MapIterator mit = map->find(reinterpret_cast<const Data&>(name.data_));
2218
+ if (mit != map->end()) {
2219
+ return MemberIterator(&members[mit->second]);
2220
+ }
2221
+ }
2222
+ return MemberEnd();
2223
+ }
2224
+
2225
+ void DoClearMembers() {
2226
+ if (Member* members = GetMembersPointer()) {
2227
+ Map* &map = GetMap(members);
2228
+ MapIterator* mit = GetMapIterators(map);
2229
+ for (SizeType i = 0; i < data_.o.size; i++) {
2230
+ map->erase(DropMapIterator(mit[i]));
2231
+ members[i].~Member();
2232
+ }
2233
+ data_.o.size = 0;
2234
+ }
2235
+ }
2236
+
2237
+ void DoFreeMembers() {
2238
+ if (Member* members = GetMembersPointer()) {
2239
+ GetMap(members)->~Map();
2240
+ for (SizeType i = 0; i < data_.o.size; i++) {
2241
+ members[i].~Member();
2242
+ }
2243
+ if (Allocator::kNeedFree) { // Shortcut by Allocator's trait
2244
+ Map** map = &GetMap(members);
2245
+ Allocator::Free(*map);
2246
+ Allocator::Free(map);
2247
+ }
2248
+ }
2249
+ }
2250
+
2251
+ #else // !RAPIDJSON_USE_MEMBERSMAP
2252
+
2253
+ RAPIDJSON_FORCEINLINE Member* DoAllocMembers(SizeType capacity, Allocator& allocator) {
2254
+ return Malloc<Member>(allocator, capacity);
2255
+ }
2256
+
2257
+ void DoReserveMembers(SizeType newCapacity, Allocator& allocator) {
2258
+ ObjectData& o = data_.o;
2259
+ if (newCapacity > o.capacity) {
2260
+ Member* newMembers = Realloc<Member>(allocator, GetMembersPointer(), o.capacity, newCapacity);
2261
+ RAPIDJSON_SETPOINTER(Member, o.members, newMembers);
2262
+ o.capacity = newCapacity;
2263
+ }
2264
+ }
2265
+
2266
+ template <typename SourceAllocator>
2267
+ MemberIterator DoFindMember(const GenericValue<Encoding, SourceAllocator>& name) {
2268
+ MemberIterator member = MemberBegin();
2269
+ for ( ; member != MemberEnd(); ++member)
2270
+ if (name.StringEqual(member->name))
2271
+ break;
2272
+ return member;
2273
+ }
2274
+
2275
+ void DoClearMembers() {
2276
+ for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
2277
+ m->~Member();
2278
+ data_.o.size = 0;
2279
+ }
2280
+
2281
+ void DoFreeMembers() {
2282
+ for (MemberIterator m = MemberBegin(); m != MemberEnd(); ++m)
2283
+ m->~Member();
2284
+ Allocator::Free(GetMembersPointer());
2285
+ }
2286
+
2287
+ #endif // !RAPIDJSON_USE_MEMBERSMAP
2288
+
2289
+ void DoAddMember(GenericValue& name, GenericValue& value, Allocator& allocator) {
2290
+ ObjectData& o = data_.o;
2291
+ if (o.size >= o.capacity)
2292
+ DoReserveMembers(o.capacity ? (o.capacity + (o.capacity + 1) / 2) : kDefaultObjectCapacity, allocator);
2293
+ Member* members = GetMembersPointer();
2294
+ Member* m = members + o.size;
2295
+ m->name.RawAssign(name);
2296
+ m->value.RawAssign(value);
2297
+ #if RAPIDJSON_USE_MEMBERSMAP
2298
+ Map* &map = GetMap(members);
2299
+ MapIterator* mit = GetMapIterators(map);
2300
+ new (&mit[o.size]) MapIterator(map->insert(MapPair(m->name.data_, o.size)));
2301
+ #endif
2302
+ ++o.size;
2303
+ }
2304
+
2305
+ MemberIterator DoRemoveMember(MemberIterator m) {
2306
+ ObjectData& o = data_.o;
2307
+ Member* members = GetMembersPointer();
2308
+ #if RAPIDJSON_USE_MEMBERSMAP
2309
+ Map* &map = GetMap(members);
2310
+ MapIterator* mit = GetMapIterators(map);
2311
+ SizeType mpos = static_cast<SizeType>(&*m - members);
2312
+ map->erase(DropMapIterator(mit[mpos]));
2313
+ #endif
2314
+ MemberIterator last(members + (o.size - 1));
2315
+ if (o.size > 1 && m != last) {
2316
+ #if RAPIDJSON_USE_MEMBERSMAP
2317
+ new (&mit[mpos]) MapIterator(DropMapIterator(mit[&*last - members]));
2318
+ mit[mpos]->second = mpos;
2319
+ #endif
2320
+ *m = *last; // Move the last one to this place
2321
+ }
2322
+ else {
2323
+ m->~Member(); // Only one left, just destroy
2324
+ }
2325
+ --o.size;
2326
+ return m;
2327
+ }
2328
+
2329
+ MemberIterator DoEraseMembers(ConstMemberIterator first, ConstMemberIterator last) {
2330
+ ObjectData& o = data_.o;
2331
+ MemberIterator beg = MemberBegin(),
2332
+ pos = beg + (first - beg),
2333
+ end = MemberEnd();
2334
+ #if RAPIDJSON_USE_MEMBERSMAP
2335
+ Map* &map = GetMap(GetMembersPointer());
2336
+ MapIterator* mit = GetMapIterators(map);
2337
+ #endif
2338
+ for (MemberIterator itr = pos; itr != last; ++itr) {
2339
+ #if RAPIDJSON_USE_MEMBERSMAP
2340
+ map->erase(DropMapIterator(mit[itr - beg]));
2341
+ #endif
2342
+ itr->~Member();
2343
+ }
2344
+ #if RAPIDJSON_USE_MEMBERSMAP
2345
+ if (first != last) {
2346
+ // Move remaining members/iterators
2347
+ MemberIterator next = pos + (last - first);
2348
+ for (MemberIterator itr = pos; next != end; ++itr, ++next) {
2349
+ std::memcpy(static_cast<void*>(&*itr), &*next, sizeof(Member));
2350
+ SizeType mpos = static_cast<SizeType>(itr - beg);
2351
+ new (&mit[mpos]) MapIterator(DropMapIterator(mit[next - beg]));
2352
+ mit[mpos]->second = mpos;
2353
+ }
2354
+ }
2355
+ #else
2356
+ std::memmove(static_cast<void*>(&*pos), &*last,
2357
+ static_cast<size_t>(end - last) * sizeof(Member));
2358
+ #endif
2359
+ o.size -= static_cast<SizeType>(last - first);
2360
+ return pos;
2361
+ }
2362
+
2363
+ template <typename SourceAllocator>
2364
+ void DoCopyMembers(const GenericValue<Encoding,SourceAllocator>& rhs, Allocator& allocator, bool copyConstStrings) {
2365
+ RAPIDJSON_ASSERT(rhs.GetType() == kObjectType);
2366
+
2367
+ data_.f.flags = kObjectFlag;
2368
+ SizeType count = rhs.data_.o.size;
2369
+ Member* lm = DoAllocMembers(count, allocator);
2370
+ const typename GenericValue<Encoding,SourceAllocator>::Member* rm = rhs.GetMembersPointer();
2371
+ #if RAPIDJSON_USE_MEMBERSMAP
2372
+ Map* &map = GetMap(lm);
2373
+ MapIterator* mit = GetMapIterators(map);
2374
+ #endif
2375
+ for (SizeType i = 0; i < count; i++) {
2376
+ new (&lm[i].name) GenericValue(rm[i].name, allocator, copyConstStrings);
2377
+ new (&lm[i].value) GenericValue(rm[i].value, allocator, copyConstStrings);
2378
+ #if RAPIDJSON_USE_MEMBERSMAP
2379
+ new (&mit[i]) MapIterator(map->insert(MapPair(lm[i].name.data_, i)));
2380
+ #endif
2381
+ }
2382
+ data_.o.size = data_.o.capacity = count;
2383
+ SetMembersPointer(lm);
2384
+ }
2385
+
2386
+ // Initialize this value as array with initial data, without calling destructor.
2387
+ void SetArrayRaw(GenericValue* values, SizeType count, Allocator& allocator) {
2388
+ data_.f.flags = kArrayFlag;
2389
+ if (count) {
2390
+ GenericValue* e = static_cast<GenericValue*>(allocator.Malloc(count * sizeof(GenericValue)));
2391
+ SetElementsPointer(e);
2392
+ std::memcpy(static_cast<void*>(e), values, count * sizeof(GenericValue));
2393
+ }
2394
+ else
2395
+ SetElementsPointer(0);
2396
+ data_.a.size = data_.a.capacity = count;
2397
+ }
2398
+
2399
+ //! Initialize this value as object with initial data, without calling destructor.
2400
+ void SetObjectRaw(Member* members, SizeType count, Allocator& allocator) {
2401
+ data_.f.flags = kObjectFlag;
2402
+ if (count) {
2403
+ Member* m = DoAllocMembers(count, allocator);
2404
+ SetMembersPointer(m);
2405
+ std::memcpy(static_cast<void*>(m), members, count * sizeof(Member));
2406
+ #if RAPIDJSON_USE_MEMBERSMAP
2407
+ Map* &map = GetMap(m);
2408
+ MapIterator* mit = GetMapIterators(map);
2409
+ for (SizeType i = 0; i < count; i++) {
2410
+ new (&mit[i]) MapIterator(map->insert(MapPair(m[i].name.data_, i)));
2411
+ }
2412
+ #endif
2413
+ }
2414
+ else
2415
+ SetMembersPointer(0);
2416
+ data_.o.size = data_.o.capacity = count;
2417
+ }
2418
+
2419
+ //! Initialize this value as constant string, without calling destructor.
2420
+ void SetStringRaw(StringRefType s) RAPIDJSON_NOEXCEPT {
2421
+ data_.f.flags = kConstStringFlag;
2422
+ SetStringPointer(s);
2423
+ data_.s.length = s.length;
2424
+ }
2425
+
2426
+ //! Initialize this value as copy string with initial data, without calling destructor.
2427
+ void SetStringRaw(StringRefType s, Allocator& allocator) {
2428
+ Ch* str = 0;
2429
+ if (ShortString::Usable(s.length)) {
2430
+ data_.f.flags = kShortStringFlag;
2431
+ data_.ss.SetLength(s.length);
2432
+ str = data_.ss.str;
2433
+ } else {
2434
+ data_.f.flags = kCopyStringFlag;
2435
+ data_.s.length = s.length;
2436
+ str = static_cast<Ch *>(allocator.Malloc((s.length + 1) * sizeof(Ch)));
2437
+ SetStringPointer(str);
2438
+ }
2439
+ std::memcpy(str, s, s.length * sizeof(Ch));
2440
+ str[s.length] = '\0';
2441
+ }
2442
+
2443
+ //! Assignment without calling destructor
2444
+ void RawAssign(GenericValue& rhs) RAPIDJSON_NOEXCEPT {
2445
+ data_ = rhs.data_;
2446
+ // data_.f.flags = rhs.data_.f.flags;
2447
+ rhs.data_.f.flags = kNullFlag;
2448
+ }
2449
+
2450
+ template <typename SourceAllocator>
2451
+ bool StringEqual(const GenericValue<Encoding, SourceAllocator>& rhs) const {
2452
+ RAPIDJSON_ASSERT(IsString());
2453
+ RAPIDJSON_ASSERT(rhs.IsString());
2454
+
2455
+ const SizeType len1 = GetStringLength();
2456
+ const SizeType len2 = rhs.GetStringLength();
2457
+ if(len1 != len2) { return false; }
2458
+
2459
+ const Ch* const str1 = GetString();
2460
+ const Ch* const str2 = rhs.GetString();
2461
+ if(str1 == str2) { return true; } // fast path for constant string
2462
+
2463
+ return (std::memcmp(str1, str2, sizeof(Ch) * len1) == 0);
2464
+ }
2465
+
2466
+ Data data_;
2467
+ };
2468
+
2469
+ //! GenericValue with UTF8 encoding
2470
+ typedef GenericValue<UTF8<> > Value;
2471
+
2472
+ ///////////////////////////////////////////////////////////////////////////////
2473
+ // GenericDocument
2474
+
2475
+ //! A document for parsing JSON text as DOM.
2476
+ /*!
2477
+ \note implements Handler concept
2478
+ \tparam Encoding Encoding for both parsing and string storage.
2479
+ \tparam Allocator Allocator for allocating memory for the DOM
2480
+ \tparam StackAllocator Allocator for allocating memory for stack during parsing.
2481
+ \warning Although GenericDocument inherits from GenericValue, the API does \b not provide any virtual functions, especially no virtual destructor. To avoid memory leaks, do not \c delete a GenericDocument object via a pointer to a GenericValue.
2482
+ */
2483
+ template <typename Encoding, typename Allocator = RAPIDJSON_DEFAULT_ALLOCATOR, typename StackAllocator = RAPIDJSON_DEFAULT_STACK_ALLOCATOR >
2484
+ class GenericDocument : public GenericValue<Encoding, Allocator> {
2485
+ public:
2486
+ typedef typename Encoding::Ch Ch; //!< Character type derived from Encoding.
2487
+ typedef GenericValue<Encoding, Allocator> ValueType; //!< Value type of the document.
2488
+ typedef Allocator AllocatorType; //!< Allocator type from template parameter.
2489
+
2490
+ //! Constructor
2491
+ /*! Creates an empty document of specified type.
2492
+ \param type Mandatory type of object to create.
2493
+ \param allocator Optional allocator for allocating memory.
2494
+ \param stackCapacity Optional initial capacity of stack in bytes.
2495
+ \param stackAllocator Optional allocator for allocating memory for stack.
2496
+ */
2497
+ explicit GenericDocument(Type type, Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2498
+ GenericValue<Encoding, Allocator>(type), allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2499
+ {
2500
+ if (!allocator_)
2501
+ ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)();
2502
+ }
2503
+
2504
+ //! Constructor
2505
+ /*! Creates an empty document which type is Null.
2506
+ \param allocator Optional allocator for allocating memory.
2507
+ \param stackCapacity Optional initial capacity of stack in bytes.
2508
+ \param stackAllocator Optional allocator for allocating memory for stack.
2509
+ */
2510
+ GenericDocument(Allocator* allocator = 0, size_t stackCapacity = kDefaultStackCapacity, StackAllocator* stackAllocator = 0) :
2511
+ allocator_(allocator), ownAllocator_(0), stack_(stackAllocator, stackCapacity), parseResult_()
2512
+ {
2513
+ if (!allocator_)
2514
+ ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator)();
2515
+ }
2516
+
2517
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2518
+ //! Move constructor in C++11
2519
+ GenericDocument(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
2520
+ : ValueType(std::forward<ValueType>(rhs)), // explicit cast to avoid prohibited move from Document
2521
+ allocator_(rhs.allocator_),
2522
+ ownAllocator_(rhs.ownAllocator_),
2523
+ stack_(std::move(rhs.stack_)),
2524
+ parseResult_(rhs.parseResult_)
2525
+ {
2526
+ rhs.allocator_ = 0;
2527
+ rhs.ownAllocator_ = 0;
2528
+ rhs.parseResult_ = ParseResult();
2529
+ }
2530
+ #endif
2531
+
2532
+ ~GenericDocument() {
2533
+ // Clear the ::ValueType before ownAllocator is destroyed, ~ValueType()
2534
+ // runs last and may access its elements or members which would be freed
2535
+ // with an allocator like MemoryPoolAllocator (CrtAllocator does not
2536
+ // free its data when destroyed, but MemoryPoolAllocator does).
2537
+ if (ownAllocator_) {
2538
+ ValueType::SetNull();
2539
+ }
2540
+ Destroy();
2541
+ }
2542
+
2543
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2544
+ //! Move assignment in C++11
2545
+ GenericDocument& operator=(GenericDocument&& rhs) RAPIDJSON_NOEXCEPT
2546
+ {
2547
+ // The cast to ValueType is necessary here, because otherwise it would
2548
+ // attempt to call GenericValue's templated assignment operator.
2549
+ ValueType::operator=(std::forward<ValueType>(rhs));
2550
+
2551
+ // Calling the destructor here would prematurely call stack_'s destructor
2552
+ Destroy();
2553
+
2554
+ allocator_ = rhs.allocator_;
2555
+ ownAllocator_ = rhs.ownAllocator_;
2556
+ stack_ = std::move(rhs.stack_);
2557
+ parseResult_ = rhs.parseResult_;
2558
+
2559
+ rhs.allocator_ = 0;
2560
+ rhs.ownAllocator_ = 0;
2561
+ rhs.parseResult_ = ParseResult();
2562
+
2563
+ return *this;
2564
+ }
2565
+ #endif
2566
+
2567
+ //! Exchange the contents of this document with those of another.
2568
+ /*!
2569
+ \param rhs Another document.
2570
+ \note Constant complexity.
2571
+ \see GenericValue::Swap
2572
+ */
2573
+ GenericDocument& Swap(GenericDocument& rhs) RAPIDJSON_NOEXCEPT {
2574
+ ValueType::Swap(rhs);
2575
+ stack_.Swap(rhs.stack_);
2576
+ internal::Swap(allocator_, rhs.allocator_);
2577
+ internal::Swap(ownAllocator_, rhs.ownAllocator_);
2578
+ internal::Swap(parseResult_, rhs.parseResult_);
2579
+ return *this;
2580
+ }
2581
+
2582
+ // Allow Swap with ValueType.
2583
+ // Refer to Effective C++ 3rd Edition/Item 33: Avoid hiding inherited names.
2584
+ using ValueType::Swap;
2585
+
2586
+ //! free-standing swap function helper
2587
+ /*!
2588
+ Helper function to enable support for common swap implementation pattern based on \c std::swap:
2589
+ \code
2590
+ void swap(MyClass& a, MyClass& b) {
2591
+ using std::swap;
2592
+ swap(a.doc, b.doc);
2593
+ // ...
2594
+ }
2595
+ \endcode
2596
+ \see Swap()
2597
+ */
2598
+ friend inline void swap(GenericDocument& a, GenericDocument& b) RAPIDJSON_NOEXCEPT { a.Swap(b); }
2599
+
2600
+ //! Populate this document by a generator which produces SAX events.
2601
+ /*! \tparam Generator A functor with <tt>bool f(Handler)</tt> prototype.
2602
+ \param g Generator functor which sends SAX events to the parameter.
2603
+ \return The document itself for fluent API.
2604
+ */
2605
+ template <typename Generator>
2606
+ GenericDocument& Populate(Generator& g) {
2607
+ ClearStackOnExit scope(*this);
2608
+ if (g(*this)) {
2609
+ RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
2610
+ ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document
2611
+ }
2612
+ return *this;
2613
+ }
2614
+
2615
+ //!@name Parse from stream
2616
+ //!@{
2617
+
2618
+ //! Parse JSON text from an input stream (with Encoding conversion)
2619
+ /*! \tparam parseFlags Combination of \ref ParseFlag.
2620
+ \tparam SourceEncoding Encoding of input stream
2621
+ \tparam InputStream Type of input stream, implementing Stream concept
2622
+ \param is Input stream to be parsed.
2623
+ \return The document itself for fluent API.
2624
+ */
2625
+ template <unsigned parseFlags, typename SourceEncoding, typename InputStream>
2626
+ GenericDocument& ParseStream(InputStream& is) {
2627
+ GenericReader<SourceEncoding, Encoding, StackAllocator> reader(
2628
+ stack_.HasAllocator() ? &stack_.GetAllocator() : 0);
2629
+ ClearStackOnExit scope(*this);
2630
+ parseResult_ = reader.template Parse<parseFlags>(is, *this);
2631
+ if (parseResult_) {
2632
+ RAPIDJSON_ASSERT(stack_.GetSize() == sizeof(ValueType)); // Got one and only one root object
2633
+ ValueType::operator=(*stack_.template Pop<ValueType>(1));// Move value from stack to document
2634
+ }
2635
+ return *this;
2636
+ }
2637
+
2638
+ //! Parse JSON text from an input stream
2639
+ /*! \tparam parseFlags Combination of \ref ParseFlag.
2640
+ \tparam InputStream Type of input stream, implementing Stream concept
2641
+ \param is Input stream to be parsed.
2642
+ \return The document itself for fluent API.
2643
+ */
2644
+ template <unsigned parseFlags, typename InputStream>
2645
+ GenericDocument& ParseStream(InputStream& is) {
2646
+ return ParseStream<parseFlags, Encoding, InputStream>(is);
2647
+ }
2648
+
2649
+ //! Parse JSON text from an input stream (with \ref kParseDefaultFlags)
2650
+ /*! \tparam InputStream Type of input stream, implementing Stream concept
2651
+ \param is Input stream to be parsed.
2652
+ \return The document itself for fluent API.
2653
+ */
2654
+ template <typename InputStream>
2655
+ GenericDocument& ParseStream(InputStream& is) {
2656
+ return ParseStream<kParseDefaultFlags, Encoding, InputStream>(is);
2657
+ }
2658
+ //!@}
2659
+
2660
+ //!@name Parse in-place from mutable string
2661
+ //!@{
2662
+
2663
+ //! Parse JSON text from a mutable string
2664
+ /*! \tparam parseFlags Combination of \ref ParseFlag.
2665
+ \param str Mutable zero-terminated string to be parsed.
2666
+ \return The document itself for fluent API.
2667
+ */
2668
+ template <unsigned parseFlags>
2669
+ GenericDocument& ParseInsitu(Ch* str) {
2670
+ GenericInsituStringStream<Encoding> s(str);
2671
+ return ParseStream<parseFlags | kParseInsituFlag>(s);
2672
+ }
2673
+
2674
+ //! Parse JSON text from a mutable string (with \ref kParseDefaultFlags)
2675
+ /*! \param str Mutable zero-terminated string to be parsed.
2676
+ \return The document itself for fluent API.
2677
+ */
2678
+ GenericDocument& ParseInsitu(Ch* str) {
2679
+ return ParseInsitu<kParseDefaultFlags>(str);
2680
+ }
2681
+ //!@}
2682
+
2683
+ //!@name Parse from read-only string
2684
+ //!@{
2685
+
2686
+ //! Parse JSON text from a read-only string (with Encoding conversion)
2687
+ /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag).
2688
+ \tparam SourceEncoding Transcoding from input Encoding
2689
+ \param str Read-only zero-terminated string to be parsed.
2690
+ */
2691
+ template <unsigned parseFlags, typename SourceEncoding>
2692
+ GenericDocument& Parse(const typename SourceEncoding::Ch* str) {
2693
+ RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
2694
+ GenericStringStream<SourceEncoding> s(str);
2695
+ return ParseStream<parseFlags, SourceEncoding>(s);
2696
+ }
2697
+
2698
+ //! Parse JSON text from a read-only string
2699
+ /*! \tparam parseFlags Combination of \ref ParseFlag (must not contain \ref kParseInsituFlag).
2700
+ \param str Read-only zero-terminated string to be parsed.
2701
+ */
2702
+ template <unsigned parseFlags>
2703
+ GenericDocument& Parse(const Ch* str) {
2704
+ return Parse<parseFlags, Encoding>(str);
2705
+ }
2706
+
2707
+ //! Parse JSON text from a read-only string (with \ref kParseDefaultFlags)
2708
+ /*! \param str Read-only zero-terminated string to be parsed.
2709
+ */
2710
+ GenericDocument& Parse(const Ch* str) {
2711
+ return Parse<kParseDefaultFlags>(str);
2712
+ }
2713
+
2714
+ template <unsigned parseFlags, typename SourceEncoding>
2715
+ GenericDocument& Parse(const typename SourceEncoding::Ch* str, size_t length) {
2716
+ RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
2717
+ MemoryStream ms(reinterpret_cast<const char*>(str), length * sizeof(typename SourceEncoding::Ch));
2718
+ EncodedInputStream<SourceEncoding, MemoryStream> is(ms);
2719
+ ParseStream<parseFlags, SourceEncoding>(is);
2720
+ return *this;
2721
+ }
2722
+
2723
+ template <unsigned parseFlags>
2724
+ GenericDocument& Parse(const Ch* str, size_t length) {
2725
+ return Parse<parseFlags, Encoding>(str, length);
2726
+ }
2727
+
2728
+ GenericDocument& Parse(const Ch* str, size_t length) {
2729
+ return Parse<kParseDefaultFlags>(str, length);
2730
+ }
2731
+
2732
+ #if RAPIDJSON_HAS_STDSTRING
2733
+ template <unsigned parseFlags, typename SourceEncoding>
2734
+ GenericDocument& Parse(const std::basic_string<typename SourceEncoding::Ch>& str) {
2735
+ // c_str() is constant complexity according to standard. Should be faster than Parse(const char*, size_t)
2736
+ return Parse<parseFlags, SourceEncoding>(str.c_str());
2737
+ }
2738
+
2739
+ template <unsigned parseFlags>
2740
+ GenericDocument& Parse(const std::basic_string<Ch>& str) {
2741
+ return Parse<parseFlags, Encoding>(str.c_str());
2742
+ }
2743
+
2744
+ GenericDocument& Parse(const std::basic_string<Ch>& str) {
2745
+ return Parse<kParseDefaultFlags>(str);
2746
+ }
2747
+ #endif // RAPIDJSON_HAS_STDSTRING
2748
+
2749
+ //!@}
2750
+
2751
+ //!@name Handling parse errors
2752
+ //!@{
2753
+
2754
+ //! Whether a parse error has occurred in the last parsing.
2755
+ bool HasParseError() const { return parseResult_.IsError(); }
2756
+
2757
+ //! Get the \ref ParseErrorCode of last parsing.
2758
+ ParseErrorCode GetParseError() const { return parseResult_.Code(); }
2759
+
2760
+ //! Get the position of last parsing error in input, 0 otherwise.
2761
+ size_t GetErrorOffset() const { return parseResult_.Offset(); }
2762
+
2763
+ //! Implicit conversion to get the last parse result
2764
+ #ifndef __clang // -Wdocumentation
2765
+ /*! \return \ref ParseResult of the last parse operation
2766
+
2767
+ \code
2768
+ Document doc;
2769
+ ParseResult ok = doc.Parse(json);
2770
+ if (!ok)
2771
+ printf( "JSON parse error: %s (%u)\n", GetParseError_En(ok.Code()), ok.Offset());
2772
+ \endcode
2773
+ */
2774
+ #endif
2775
+ operator ParseResult() const { return parseResult_; }
2776
+ //!@}
2777
+
2778
+ //! Get the allocator of this document.
2779
+ Allocator& GetAllocator() {
2780
+ RAPIDJSON_ASSERT(allocator_);
2781
+ return *allocator_;
2782
+ }
2783
+
2784
+ //! Get the capacity of stack in bytes.
2785
+ size_t GetStackCapacity() const { return stack_.GetCapacity(); }
2786
+
2787
+ private:
2788
+ // clear stack on any exit from ParseStream, e.g. due to exception
2789
+ struct ClearStackOnExit {
2790
+ explicit ClearStackOnExit(GenericDocument& d) : d_(d) {}
2791
+ ~ClearStackOnExit() { d_.ClearStack(); }
2792
+ private:
2793
+ ClearStackOnExit(const ClearStackOnExit&);
2794
+ ClearStackOnExit& operator=(const ClearStackOnExit&);
2795
+ GenericDocument& d_;
2796
+ };
2797
+
2798
+ // callers of the following private Handler functions
2799
+ // template <typename,typename,typename> friend class GenericReader; // for parsing
2800
+ template <typename, typename> friend class GenericValue; // for deep copying
2801
+
2802
+ public:
2803
+ // Implementation of Handler
2804
+ bool Null() { new (stack_.template Push<ValueType>()) ValueType(); return true; }
2805
+ bool Bool(bool b) { new (stack_.template Push<ValueType>()) ValueType(b); return true; }
2806
+ bool Int(int i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2807
+ bool Uint(unsigned i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2808
+ bool Int64(int64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2809
+ bool Uint64(uint64_t i) { new (stack_.template Push<ValueType>()) ValueType(i); return true; }
2810
+ bool Double(double d) { new (stack_.template Push<ValueType>()) ValueType(d); return true; }
2811
+
2812
+ bool RawNumber(const Ch* str, SizeType length, bool copy) {
2813
+ if (copy)
2814
+ new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2815
+ else
2816
+ new (stack_.template Push<ValueType>()) ValueType(str, length);
2817
+ return true;
2818
+ }
2819
+
2820
+ bool String(const Ch* str, SizeType length, bool copy) {
2821
+ if (copy)
2822
+ new (stack_.template Push<ValueType>()) ValueType(str, length, GetAllocator());
2823
+ else
2824
+ new (stack_.template Push<ValueType>()) ValueType(str, length);
2825
+ return true;
2826
+ }
2827
+
2828
+ bool StartObject() { new (stack_.template Push<ValueType>()) ValueType(kObjectType); return true; }
2829
+
2830
+ bool Key(const Ch* str, SizeType length, bool copy) { return String(str, length, copy); }
2831
+
2832
+ bool EndObject(SizeType memberCount) {
2833
+ typename ValueType::Member* members = stack_.template Pop<typename ValueType::Member>(memberCount);
2834
+ stack_.template Top<ValueType>()->SetObjectRaw(members, memberCount, GetAllocator());
2835
+ return true;
2836
+ }
2837
+
2838
+ bool StartArray() { new (stack_.template Push<ValueType>()) ValueType(kArrayType); return true; }
2839
+
2840
+ bool EndArray(SizeType elementCount) {
2841
+ ValueType* elements = stack_.template Pop<ValueType>(elementCount);
2842
+ stack_.template Top<ValueType>()->SetArrayRaw(elements, elementCount, GetAllocator());
2843
+ return true;
2844
+ }
2845
+
2846
+ private:
2847
+ //! Prohibit copying
2848
+ GenericDocument(const GenericDocument&);
2849
+ //! Prohibit assignment
2850
+ GenericDocument& operator=(const GenericDocument&);
2851
+
2852
+ void ClearStack() {
2853
+ if (Allocator::kNeedFree)
2854
+ while (stack_.GetSize() > 0) // Here assumes all elements in stack array are GenericValue (Member is actually 2 GenericValue objects)
2855
+ (stack_.template Pop<ValueType>(1))->~ValueType();
2856
+ else
2857
+ stack_.Clear();
2858
+ stack_.ShrinkToFit();
2859
+ }
2860
+
2861
+ void Destroy() {
2862
+ RAPIDJSON_DELETE(ownAllocator_);
2863
+ }
2864
+
2865
+ static const size_t kDefaultStackCapacity = 1024;
2866
+ Allocator* allocator_;
2867
+ Allocator* ownAllocator_;
2868
+ internal::Stack<StackAllocator> stack_;
2869
+ ParseResult parseResult_;
2870
+ };
2871
+
2872
+ //! GenericDocument with UTF8 encoding
2873
+ typedef GenericDocument<UTF8<> > Document;
2874
+
2875
+
2876
+ //! Helper class for accessing Value of array type.
2877
+ /*!
2878
+ Instance of this helper class is obtained by \c GenericValue::GetArray().
2879
+ In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1.
2880
+ */
2881
+ template <bool Const, typename ValueT>
2882
+ class GenericArray {
2883
+ public:
2884
+ typedef GenericArray<true, ValueT> ConstArray;
2885
+ typedef GenericArray<false, ValueT> Array;
2886
+ typedef ValueT PlainType;
2887
+ typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;
2888
+ typedef ValueType* ValueIterator; // This may be const or non-const iterator
2889
+ typedef const ValueT* ConstValueIterator;
2890
+ typedef typename ValueType::AllocatorType AllocatorType;
2891
+ typedef typename ValueType::StringRefType StringRefType;
2892
+
2893
+ template <typename, typename>
2894
+ friend class GenericValue;
2895
+
2896
+ GenericArray(const GenericArray& rhs) : value_(rhs.value_) {}
2897
+ GenericArray& operator=(const GenericArray& rhs) { value_ = rhs.value_; return *this; }
2898
+ ~GenericArray() {}
2899
+
2900
+ operator ValueType&() const { return value_; }
2901
+ SizeType Size() const { return value_.Size(); }
2902
+ SizeType Capacity() const { return value_.Capacity(); }
2903
+ bool Empty() const { return value_.Empty(); }
2904
+ void Clear() const { value_.Clear(); }
2905
+ ValueType& operator[](SizeType index) const { return value_[index]; }
2906
+ ValueIterator Begin() const { return value_.Begin(); }
2907
+ ValueIterator End() const { return value_.End(); }
2908
+ GenericArray Reserve(SizeType newCapacity, AllocatorType &allocator) const { value_.Reserve(newCapacity, allocator); return *this; }
2909
+ GenericArray PushBack(ValueType& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2910
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2911
+ GenericArray PushBack(ValueType&& value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2912
+ #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2913
+ GenericArray PushBack(StringRefType value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2914
+ template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (const GenericArray&)) PushBack(T value, AllocatorType& allocator) const { value_.PushBack(value, allocator); return *this; }
2915
+ GenericArray PopBack() const { value_.PopBack(); return *this; }
2916
+ ValueIterator Erase(ConstValueIterator pos) const { return value_.Erase(pos); }
2917
+ ValueIterator Erase(ConstValueIterator first, ConstValueIterator last) const { return value_.Erase(first, last); }
2918
+
2919
+ #if RAPIDJSON_HAS_CXX11_RANGE_FOR
2920
+ ValueIterator begin() const { return value_.Begin(); }
2921
+ ValueIterator end() const { return value_.End(); }
2922
+ #endif
2923
+
2924
+ private:
2925
+ GenericArray();
2926
+ GenericArray(ValueType& value) : value_(value) {}
2927
+ ValueType& value_;
2928
+ };
2929
+
2930
+ //! Helper class for accessing Value of object type.
2931
+ /*!
2932
+ Instance of this helper class is obtained by \c GenericValue::GetObject().
2933
+ In addition to all APIs for array type, it provides range-based for loop if \c RAPIDJSON_HAS_CXX11_RANGE_FOR=1.
2934
+ */
2935
+ template <bool Const, typename ValueT>
2936
+ class GenericObject {
2937
+ public:
2938
+ typedef GenericObject<true, ValueT> ConstObject;
2939
+ typedef GenericObject<false, ValueT> Object;
2940
+ typedef ValueT PlainType;
2941
+ typedef typename internal::MaybeAddConst<Const,PlainType>::Type ValueType;
2942
+ typedef GenericMemberIterator<Const, typename ValueT::EncodingType, typename ValueT::AllocatorType> MemberIterator; // This may be const or non-const iterator
2943
+ typedef GenericMemberIterator<true, typename ValueT::EncodingType, typename ValueT::AllocatorType> ConstMemberIterator;
2944
+ typedef typename ValueType::AllocatorType AllocatorType;
2945
+ typedef typename ValueType::StringRefType StringRefType;
2946
+ typedef typename ValueType::EncodingType EncodingType;
2947
+ typedef typename ValueType::Ch Ch;
2948
+
2949
+ template <typename, typename>
2950
+ friend class GenericValue;
2951
+
2952
+ GenericObject(const GenericObject& rhs) : value_(rhs.value_) {}
2953
+ GenericObject& operator=(const GenericObject& rhs) { value_ = rhs.value_; return *this; }
2954
+ ~GenericObject() {}
2955
+
2956
+ operator ValueType&() const { return value_; }
2957
+ SizeType MemberCount() const { return value_.MemberCount(); }
2958
+ SizeType MemberCapacity() const { return value_.MemberCapacity(); }
2959
+ bool ObjectEmpty() const { return value_.ObjectEmpty(); }
2960
+ template <typename T> ValueType& operator[](T* name) const { return value_[name]; }
2961
+ template <typename SourceAllocator> ValueType& operator[](const GenericValue<EncodingType, SourceAllocator>& name) const { return value_[name]; }
2962
+ #if RAPIDJSON_HAS_STDSTRING
2963
+ ValueType& operator[](const std::basic_string<Ch>& name) const { return value_[name]; }
2964
+ #endif
2965
+ MemberIterator MemberBegin() const { return value_.MemberBegin(); }
2966
+ MemberIterator MemberEnd() const { return value_.MemberEnd(); }
2967
+ GenericObject MemberReserve(SizeType newCapacity, AllocatorType &allocator) const { value_.MemberReserve(newCapacity, allocator); return *this; }
2968
+ bool HasMember(const Ch* name) const { return value_.HasMember(name); }
2969
+ #if RAPIDJSON_HAS_STDSTRING
2970
+ bool HasMember(const std::basic_string<Ch>& name) const { return value_.HasMember(name); }
2971
+ #endif
2972
+ template <typename SourceAllocator> bool HasMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.HasMember(name); }
2973
+ MemberIterator FindMember(const Ch* name) const { return value_.FindMember(name); }
2974
+ template <typename SourceAllocator> MemberIterator FindMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.FindMember(name); }
2975
+ #if RAPIDJSON_HAS_STDSTRING
2976
+ MemberIterator FindMember(const std::basic_string<Ch>& name) const { return value_.FindMember(name); }
2977
+ #endif
2978
+ GenericObject AddMember(ValueType& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2979
+ GenericObject AddMember(ValueType& name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2980
+ #if RAPIDJSON_HAS_STDSTRING
2981
+ GenericObject AddMember(ValueType& name, std::basic_string<Ch>& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2982
+ #endif
2983
+ template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (ValueType&)) AddMember(ValueType& name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2984
+ #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
2985
+ GenericObject AddMember(ValueType&& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2986
+ GenericObject AddMember(ValueType&& name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2987
+ GenericObject AddMember(ValueType& name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2988
+ GenericObject AddMember(StringRefType name, ValueType&& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2989
+ #endif // RAPIDJSON_HAS_CXX11_RVALUE_REFS
2990
+ GenericObject AddMember(StringRefType name, ValueType& value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2991
+ GenericObject AddMember(StringRefType name, StringRefType value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2992
+ template <typename T> RAPIDJSON_DISABLEIF_RETURN((internal::OrExpr<internal::IsPointer<T>, internal::IsGenericValue<T> >), (GenericObject)) AddMember(StringRefType name, T value, AllocatorType& allocator) const { value_.AddMember(name, value, allocator); return *this; }
2993
+ void RemoveAllMembers() { value_.RemoveAllMembers(); }
2994
+ bool RemoveMember(const Ch* name) const { return value_.RemoveMember(name); }
2995
+ #if RAPIDJSON_HAS_STDSTRING
2996
+ bool RemoveMember(const std::basic_string<Ch>& name) const { return value_.RemoveMember(name); }
2997
+ #endif
2998
+ template <typename SourceAllocator> bool RemoveMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.RemoveMember(name); }
2999
+ MemberIterator RemoveMember(MemberIterator m) const { return value_.RemoveMember(m); }
3000
+ MemberIterator EraseMember(ConstMemberIterator pos) const { return value_.EraseMember(pos); }
3001
+ MemberIterator EraseMember(ConstMemberIterator first, ConstMemberIterator last) const { return value_.EraseMember(first, last); }
3002
+ bool EraseMember(const Ch* name) const { return value_.EraseMember(name); }
3003
+ #if RAPIDJSON_HAS_STDSTRING
3004
+ bool EraseMember(const std::basic_string<Ch>& name) const { return EraseMember(ValueType(StringRef(name))); }
3005
+ #endif
3006
+ template <typename SourceAllocator> bool EraseMember(const GenericValue<EncodingType, SourceAllocator>& name) const { return value_.EraseMember(name); }
3007
+
3008
+ #if RAPIDJSON_HAS_CXX11_RANGE_FOR
3009
+ MemberIterator begin() const { return value_.MemberBegin(); }
3010
+ MemberIterator end() const { return value_.MemberEnd(); }
3011
+ #endif
3012
+
3013
+ private:
3014
+ GenericObject();
3015
+ GenericObject(ValueType& value) : value_(value) {}
3016
+ ValueType& value_;
3017
+ };
3018
+
3019
+ RAPIDJSON_NAMESPACE_END
3020
+ RAPIDJSON_DIAG_POP
3021
+
3022
+ #ifdef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED
3023
+ #pragma pop_macro("GetObject")
3024
+ #undef RAPIDJSON_WINDOWS_GETOBJECT_WORKAROUND_APPLIED
3025
+ #endif
3026
+
3027
+ #endif // RAPIDJSON_DOCUMENT_H_