passenger 3.0.21 → 3.9.1.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (835) hide show
  1. data/DEVELOPERS.TXT +4 -10
  2. data/NEWS +19 -27
  3. data/Rakefile +20 -19
  4. data/bin/passenger +3 -2
  5. data/bin/passenger-config +35 -5
  6. data/bin/passenger-install-apache2-module +12 -12
  7. data/bin/passenger-install-nginx-module +55 -38
  8. data/bin/passenger-memory-stats +3 -1
  9. data/bin/passenger-status +7 -35
  10. data/build/agents.rb +107 -21
  11. data/build/apache2.rb +11 -46
  12. data/build/basics.rb +61 -9
  13. data/build/common_library.rb +59 -142
  14. data/build/cxx_tests.rb +111 -110
  15. data/build/documentation.rb +33 -0
  16. data/build/misc.rb +30 -12
  17. data/build/nginx.rb +10 -39
  18. data/build/oxt_tests.rb +1 -0
  19. data/build/ruby_extension.rb +1 -5
  20. data/build/test_basics.rb +3 -2
  21. data/dev/copy_boost_headers.rb +2 -1
  22. data/doc/Architectural overview.html +49 -90
  23. data/doc/DebuggingAndStressTesting.txt.md +49 -0
  24. data/doc/Packaging.txt.md +254 -0
  25. data/doc/Security of user switching support.html +35 -66
  26. data/doc/Users guide Apache.html +588 -758
  27. data/doc/Users guide Apache.idmap.txt +253 -136
  28. data/doc/Users guide Apache.txt +154 -109
  29. data/doc/Users guide Nginx.html +544 -660
  30. data/doc/Users guide Nginx.idmap.txt +179 -91
  31. data/doc/Users guide Nginx.txt +192 -118
  32. data/doc/Users guide Standalone.html +65 -48
  33. data/doc/Users guide Standalone.idmap.txt +10 -2
  34. data/doc/Users guide Standalone.txt +4 -0
  35. data/doc/images/glyphicons-halflings-white.png +0 -0
  36. data/doc/images/glyphicons-halflings.png +0 -0
  37. data/doc/images/phusion_banner_small.png +0 -0
  38. data/doc/images/{smart-lv2.png → smart.png} +0 -0
  39. data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
  40. data/doc/templates/bootstrap.min.css +397 -0
  41. data/doc/templates/markdown.html.erb +117 -0
  42. data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
  43. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
  44. data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
  45. data/doc/users_guide_snippets/support_information.txt +30 -0
  46. data/ext/apache2/Bucket.cpp +9 -26
  47. data/ext/apache2/Bucket.h +13 -10
  48. data/ext/apache2/Configuration.cpp +70 -58
  49. data/ext/apache2/Configuration.hpp +19 -47
  50. data/ext/apache2/DirectoryMapper.h +7 -7
  51. data/ext/apache2/Hooks.cpp +150 -313
  52. data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
  53. data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
  54. data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
  55. data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
  56. data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
  57. data/ext/boost/algorithm/string/formatter.hpp +20 -3
  58. data/ext/boost/assert.hpp +85 -4
  59. data/ext/boost/bind/bind.hpp +1 -1
  60. data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
  61. data/ext/boost/concept_check.hpp +140 -64
  62. data/ext/boost/config.hpp +1 -1
  63. data/ext/boost/config/auto_link.hpp +8 -6
  64. data/ext/boost/config/compiler/borland.hpp +12 -2
  65. data/ext/boost/config/compiler/clang.hpp +89 -30
  66. data/ext/boost/config/compiler/codegear.hpp +3 -2
  67. data/ext/boost/config/compiler/common_edg.hpp +7 -5
  68. data/ext/boost/config/compiler/cray.hpp +61 -0
  69. data/ext/boost/config/compiler/digitalmars.hpp +9 -1
  70. data/ext/boost/config/compiler/gcc.hpp +33 -24
  71. data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
  72. data/ext/boost/config/compiler/hp_acc.hpp +12 -1
  73. data/ext/boost/config/compiler/intel.hpp +78 -4
  74. data/ext/boost/config/compiler/metrowerks.hpp +4 -1
  75. data/ext/boost/config/compiler/mpw.hpp +4 -1
  76. data/ext/boost/config/compiler/nvcc.hpp +8 -66
  77. data/ext/boost/config/compiler/pathscale.hpp +80 -0
  78. data/ext/boost/config/compiler/pgi.hpp +5 -5
  79. data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
  80. data/ext/boost/config/compiler/vacpp.hpp +37 -13
  81. data/ext/boost/config/compiler/visualc.hpp +24 -11
  82. data/ext/boost/config/platform/bsd.hpp +1 -1
  83. data/ext/boost/config/platform/cray.hpp +18 -0
  84. data/ext/boost/config/platform/cygwin.hpp +10 -0
  85. data/ext/boost/config/platform/linux.hpp +5 -0
  86. data/ext/boost/config/platform/macos.hpp +5 -4
  87. data/ext/boost/config/platform/symbian.hpp +5 -2
  88. data/ext/boost/config/platform/vms.hpp +25 -0
  89. data/ext/boost/config/platform/win32.hpp +7 -1
  90. data/ext/boost/config/select_compiler_config.hpp +8 -25
  91. data/ext/boost/config/select_platform_config.hpp +8 -1
  92. data/ext/boost/config/select_stdlib_config.hpp +9 -1
  93. data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
  94. data/ext/boost/config/stdlib/libcomo.hpp +1 -4
  95. data/ext/boost/config/stdlib/libcpp.hpp +36 -0
  96. data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
  97. data/ext/boost/config/stdlib/modena.hpp +1 -4
  98. data/ext/boost/config/stdlib/msl.hpp +1 -4
  99. data/ext/boost/config/stdlib/roguewave.hpp +9 -6
  100. data/ext/boost/config/stdlib/sgi.hpp +12 -4
  101. data/ext/boost/config/stdlib/stlport.hpp +11 -4
  102. data/ext/boost/config/stdlib/vacpp.hpp +11 -4
  103. data/ext/boost/config/suffix.hpp +71 -6
  104. data/ext/boost/config/warning_disable.hpp +1 -1
  105. data/ext/boost/container/container_fwd.hpp +177 -0
  106. data/ext/boost/cstdint.hpp +17 -12
  107. data/ext/boost/current_function.hpp +2 -1
  108. data/ext/boost/date_time/c_time.hpp +17 -1
  109. data/ext/boost/date_time/compiler_config.hpp +13 -15
  110. data/ext/boost/date_time/date_formatting.hpp +7 -1
  111. data/ext/boost/date_time/filetime_functions.hpp +4 -4
  112. data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
  113. data/ext/boost/date_time/strings_from_facet.hpp +3 -3
  114. data/ext/boost/date_time/time_facet.hpp +101 -101
  115. data/ext/boost/detail/endian.hpp +4 -2
  116. data/ext/boost/detail/fenv.hpp +74 -0
  117. data/ext/boost/detail/sp_typeinfo.hpp +6 -0
  118. data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
  119. data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
  120. data/ext/boost/exception/detail/type_info.hpp +3 -3
  121. data/ext/boost/exception/diagnostic_information.hpp +37 -21
  122. data/ext/boost/exception/exception.hpp +21 -1
  123. data/ext/boost/exception/info.hpp +0 -1
  124. data/ext/boost/function.hpp +2 -2
  125. data/ext/boost/function/function_base.hpp +15 -9
  126. data/ext/boost/function/function_template.hpp +26 -48
  127. data/ext/boost/integer_fwd.hpp +0 -16
  128. data/ext/boost/integer_traits.hpp +2 -2
  129. data/ext/boost/iterator.hpp +1 -1
  130. data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
  131. data/ext/boost/iterator/iterator_facade.hpp +13 -13
  132. data/ext/boost/iterator/transform_iterator.hpp +5 -20
  133. data/ext/boost/lexical_cast.hpp +1655 -673
  134. data/ext/boost/math/policies/policy.hpp +982 -0
  135. data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
  136. data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
  137. data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
  138. data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
  139. data/ext/boost/math/special_functions/sign.hpp +145 -0
  140. data/ext/boost/math/tools/config.hpp +321 -0
  141. data/ext/boost/math/tools/promotion.hpp +150 -0
  142. data/ext/boost/math/tools/real_cast.hpp +29 -0
  143. data/ext/boost/math/tools/user.hpp +97 -0
  144. data/ext/boost/move/move.hpp +1222 -0
  145. data/ext/boost/mpl/O1_size.hpp +40 -0
  146. data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
  147. data/ext/boost/mpl/advance.hpp +76 -0
  148. data/ext/boost/mpl/advance_fwd.hpp +28 -0
  149. data/ext/boost/mpl/at.hpp +52 -0
  150. data/ext/boost/mpl/at_fwd.hpp +24 -0
  151. data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
  152. data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
  153. data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
  154. data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
  155. data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
  156. data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
  157. data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
  158. data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
  159. data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
  160. data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
  161. data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
  162. data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
  163. data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
  164. data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
  165. data/ext/boost/mpl/aux_/has_size.hpp +23 -0
  166. data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
  167. data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
  168. data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
  169. data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
  170. data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
  171. data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
  172. data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
  173. data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
  174. data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
  175. data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
  176. data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
  177. data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
  178. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
  179. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
  180. data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
  181. data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
  182. data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
  183. data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
  184. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
  185. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
  186. data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
  187. data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
  188. data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
  189. data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
  190. data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
  191. data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
  192. data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
  193. data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
  194. data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
  195. data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
  196. data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
  197. data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
  198. data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
  199. data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
  200. data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
  201. data/ext/boost/mpl/back_fwd.hpp +24 -0
  202. data/ext/boost/mpl/back_inserter.hpp +34 -0
  203. data/ext/boost/mpl/begin_end.hpp +57 -0
  204. data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
  205. data/ext/boost/mpl/clear.hpp +39 -0
  206. data/ext/boost/mpl/clear_fwd.hpp +24 -0
  207. data/ext/boost/mpl/comparison.hpp +24 -0
  208. data/ext/boost/mpl/contains.hpp +41 -0
  209. data/ext/boost/mpl/contains_fwd.hpp +25 -0
  210. data/ext/boost/mpl/deref.hpp +41 -0
  211. data/ext/boost/mpl/distance.hpp +78 -0
  212. data/ext/boost/mpl/distance_fwd.hpp +28 -0
  213. data/ext/boost/mpl/empty_fwd.hpp +24 -0
  214. data/ext/boost/mpl/equal_to.hpp +21 -0
  215. data/ext/boost/mpl/find.hpp +38 -0
  216. data/ext/boost/mpl/find_if.hpp +50 -0
  217. data/ext/boost/mpl/fold.hpp +48 -0
  218. data/ext/boost/mpl/front_fwd.hpp +24 -0
  219. data/ext/boost/mpl/front_inserter.hpp +33 -0
  220. data/ext/boost/mpl/greater.hpp +21 -0
  221. data/ext/boost/mpl/greater_equal.hpp +21 -0
  222. data/ext/boost/mpl/inserter.hpp +32 -0
  223. data/ext/boost/mpl/iter_fold.hpp +49 -0
  224. data/ext/boost/mpl/iter_fold_if.hpp +117 -0
  225. data/ext/boost/mpl/iterator_range.hpp +42 -0
  226. data/ext/boost/mpl/iterator_tags.hpp +27 -0
  227. data/ext/boost/mpl/less.hpp +21 -0
  228. data/ext/boost/mpl/less_equal.hpp +21 -0
  229. data/ext/boost/mpl/limits/list.hpp +21 -0
  230. data/ext/boost/mpl/limits/vector.hpp +21 -0
  231. data/ext/boost/mpl/list.hpp +57 -0
  232. data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
  233. data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
  234. data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
  235. data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
  236. data/ext/boost/mpl/list/aux_/front.hpp +33 -0
  237. data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
  238. data/ext/boost/mpl/list/aux_/item.hpp +55 -0
  239. data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
  240. data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
  241. data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
  242. data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
  243. data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
  244. data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
  245. data/ext/boost/mpl/list/aux_/size.hpp +33 -0
  246. data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
  247. data/ext/boost/mpl/list/list0.hpp +42 -0
  248. data/ext/boost/mpl/list/list10.hpp +43 -0
  249. data/ext/boost/mpl/list/list20.hpp +43 -0
  250. data/ext/boost/mpl/long.hpp +22 -0
  251. data/ext/boost/mpl/long_fwd.hpp +27 -0
  252. data/ext/boost/mpl/minus.hpp +21 -0
  253. data/ext/boost/mpl/multiplies.hpp +53 -0
  254. data/ext/boost/mpl/negate.hpp +81 -0
  255. data/ext/boost/mpl/not_equal_to.hpp +21 -0
  256. data/ext/boost/mpl/numeric_cast.hpp +41 -0
  257. data/ext/boost/mpl/pair.hpp +70 -0
  258. data/ext/boost/mpl/plus.hpp +21 -0
  259. data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
  260. data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
  261. data/ext/boost/mpl/prior.hpp +19 -0
  262. data/ext/boost/mpl/push_back.hpp +53 -0
  263. data/ext/boost/mpl/push_back_fwd.hpp +24 -0
  264. data/ext/boost/mpl/push_front.hpp +52 -0
  265. data/ext/boost/mpl/push_front_fwd.hpp +24 -0
  266. data/ext/boost/mpl/remove_if.hpp +83 -0
  267. data/ext/boost/mpl/reverse_fold.hpp +50 -0
  268. data/ext/boost/mpl/same_as.hpp +55 -0
  269. data/ext/boost/mpl/sequence_tag.hpp +124 -0
  270. data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
  271. data/ext/boost/mpl/size.hpp +42 -0
  272. data/ext/boost/mpl/size_fwd.hpp +24 -0
  273. data/ext/boost/mpl/tag.hpp +52 -0
  274. data/ext/boost/mpl/times.hpp +21 -0
  275. data/ext/boost/mpl/vector.hpp +57 -0
  276. data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
  277. data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
  278. data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
  279. data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
  280. data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
  281. data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
  282. data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
  283. data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
  284. data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
  285. data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
  286. data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
  287. data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
  288. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
  289. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
  290. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
  291. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
  292. data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
  293. data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
  294. data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
  295. data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
  296. data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
  297. data/ext/boost/mpl/vector/vector0.hpp +34 -0
  298. data/ext/boost/mpl/vector/vector10.hpp +45 -0
  299. data/ext/boost/mpl/vector/vector20.hpp +45 -0
  300. data/ext/boost/none.hpp +1 -1
  301. data/ext/boost/numeric/conversion/bounds.hpp +24 -0
  302. data/ext/boost/numeric/conversion/cast.hpp +61 -0
  303. data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
  304. data/ext/boost/numeric/conversion/converter.hpp +68 -0
  305. data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
  306. data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
  307. data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
  308. data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
  309. data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
  310. data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
  311. data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
  312. data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
  313. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
  314. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
  315. data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
  316. data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
  317. data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
  318. data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
  319. data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
  320. data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
  321. data/ext/boost/operators.hpp +3 -1
  322. data/ext/boost/optional/optional.hpp +146 -79
  323. data/ext/boost/optional/optional_fwd.hpp +8 -1
  324. data/ext/boost/preprocessor/cat.hpp +2 -2
  325. data/ext/boost/preprocessor/config/config.hpp +39 -4
  326. data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
  327. data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
  328. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
  329. data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
  330. data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
  331. data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
  332. data/ext/boost/preprocessor/seq/cat.hpp +5 -4
  333. data/ext/boost/preprocessor/seq/size.hpp +0 -1
  334. data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
  335. data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
  336. data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
  337. data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
  338. data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
  339. data/ext/boost/preprocessor/variadic/size.hpp +30 -0
  340. data/ext/boost/range/begin.hpp +17 -6
  341. data/ext/boost/range/concepts.hpp +37 -2
  342. data/ext/boost/range/detail/safe_bool.hpp +72 -0
  343. data/ext/boost/range/end.hpp +14 -9
  344. data/ext/boost/range/iterator_range_core.hpp +120 -12
  345. data/ext/boost/range/size.hpp +21 -5
  346. data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
  347. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
  348. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
  349. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
  350. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
  351. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
  352. data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
  353. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
  354. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
  355. data/ext/boost/smart_ptr/make_shared.hpp +591 -22
  356. data/ext/boost/smart_ptr/shared_array.hpp +29 -1
  357. data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
  358. data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
  359. data/ext/boost/src/pthread/once.cpp +9 -7
  360. data/ext/boost/src/pthread/thread.cpp +32 -28
  361. data/ext/boost/src/pthread/timeconv.inl +4 -5
  362. data/ext/boost/src/tss_null.cpp +5 -1
  363. data/ext/boost/static_assert.hpp +8 -2
  364. data/ext/boost/thread/detail/config.hpp +19 -4
  365. data/ext/boost/thread/detail/move.hpp +11 -5
  366. data/ext/boost/thread/detail/thread.hpp +59 -43
  367. data/ext/boost/thread/exceptions.hpp +9 -9
  368. data/ext/boost/thread/future.hpp +150 -82
  369. data/ext/boost/thread/locks.hpp +101 -60
  370. data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
  371. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
  372. data/ext/boost/thread/pthread/mutex.hpp +17 -14
  373. data/ext/boost/thread/pthread/once.hpp +3 -4
  374. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
  375. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
  376. data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
  377. data/ext/boost/thread/pthread/thread_data.hpp +40 -12
  378. data/ext/boost/thread/thread_time.hpp +5 -0
  379. data/ext/boost/throw_exception.hpp +1 -1
  380. data/ext/boost/token_functions.hpp +34 -10
  381. data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
  382. data/ext/boost/type_traits/alignment_of.hpp +1 -1
  383. data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
  384. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
  385. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
  386. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
  387. data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
  388. data/ext/boost/type_traits/function_traits.hpp +1 -1
  389. data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
  390. data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
  391. data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
  392. data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
  393. data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
  394. data/ext/boost/type_traits/intrinsics.hpp +119 -71
  395. data/ext/boost/type_traits/is_const.hpp +5 -5
  396. data/ext/boost/type_traits/is_convertible.hpp +14 -13
  397. data/ext/boost/type_traits/is_enum.hpp +1 -1
  398. data/ext/boost/type_traits/is_floating_point.hpp +27 -0
  399. data/ext/boost/type_traits/is_function.hpp +3 -3
  400. data/ext/boost/type_traits/is_fundamental.hpp +1 -1
  401. data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
  402. data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
  403. data/ext/boost/type_traits/is_pod.hpp +11 -3
  404. data/ext/boost/type_traits/is_pointer.hpp +2 -2
  405. data/ext/boost/type_traits/is_signed.hpp +8 -3
  406. data/ext/boost/type_traits/is_union.hpp +8 -0
  407. data/ext/boost/type_traits/is_unsigned.hpp +9 -4
  408. data/ext/boost/type_traits/is_volatile.hpp +5 -5
  409. data/ext/boost/type_traits/remove_cv.hpp +4 -3
  410. data/ext/boost/type_traits/remove_pointer.hpp +51 -2
  411. data/ext/boost/type_traits/remove_reference.hpp +2 -2
  412. data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
  413. data/ext/boost/utility/declval.hpp +44 -0
  414. data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
  415. data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
  416. data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
  417. data/ext/boost/utility/in_place_factory.hpp +88 -0
  418. data/ext/boost/utility/result_of.hpp +103 -0
  419. data/ext/boost/utility/swap.hpp +55 -0
  420. data/ext/common/AnsiColorConstants.h +36 -0
  421. data/ext/common/ApplicationPool2/Common.h +87 -0
  422. data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
  423. data/ext/common/ApplicationPool2/Group.h +648 -0
  424. data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
  425. data/ext/common/ApplicationPool2/Options.h +576 -0
  426. data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
  427. data/ext/common/ApplicationPool2/Pool.h +1181 -0
  428. data/ext/common/ApplicationPool2/Process.h +425 -0
  429. data/ext/common/ApplicationPool2/README.md +96 -0
  430. data/ext/common/ApplicationPool2/Session.h +158 -0
  431. data/ext/common/ApplicationPool2/Socket.h +246 -0
  432. data/ext/common/ApplicationPool2/Spawner.h +2212 -0
  433. data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
  434. data/ext/common/BackgroundEventLoop.cpp +129 -0
  435. data/ext/common/BackgroundEventLoop.h +61 -0
  436. data/ext/common/Constants.h +3 -1
  437. data/ext/common/EventedBufferedInput.h +331 -0
  438. data/ext/common/EventedMessageServer.h +17 -34
  439. data/ext/common/EventedServer.h +2 -2
  440. data/ext/common/Exceptions.h +71 -19
  441. data/ext/common/FileDescriptor.h +8 -6
  442. data/ext/common/HttpConstants.h +167 -0
  443. data/ext/common/IniFile.h +24 -0
  444. data/ext/common/Logging.h +62 -849
  445. data/ext/common/MessageReadersWriters.h +19 -0
  446. data/ext/common/MessageServer.h +11 -14
  447. data/ext/common/MultiLibeio.cpp +198 -0
  448. data/ext/common/MultiLibeio.h +67 -0
  449. data/ext/common/ResourceLocator.h +24 -41
  450. data/ext/common/SafeLibev.h +186 -14
  451. data/ext/common/StaticString.h +23 -3
  452. data/ext/common/UnionStation.h +972 -0
  453. data/ext/common/Utils.cpp +168 -24
  454. data/ext/common/Utils.h +25 -3
  455. data/ext/common/Utils/CachedFileStat.hpp +4 -3
  456. data/ext/common/Utils/FileChangeChecker.h +2 -2
  457. data/ext/common/Utils/HashMap.h +50 -0
  458. data/ext/common/Utils/IOUtils.cpp +229 -68
  459. data/ext/common/Utils/IOUtils.h +134 -3
  460. data/ext/common/Utils/Lock.h +28 -0
  461. data/ext/common/Utils/MemoryBarrier.h +52 -0
  462. data/ext/common/Utils/PriorityQueue.h +54 -0
  463. data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
  464. data/ext/common/Utils/ScopeGuard.h +50 -1
  465. data/ext/common/Utils/SmallVector.h +653 -0
  466. data/ext/common/Utils/StrIntUtils.cpp +26 -2
  467. data/ext/common/Utils/StrIntUtils.h +18 -2
  468. data/ext/common/Utils/StringMap.h +125 -8
  469. data/ext/common/Utils/Template.h +212 -0
  470. data/ext/common/Utils/fib.c +699 -0
  471. data/ext/common/Utils/fib.h +101 -0
  472. data/ext/common/Utils/fibpriv.h +67 -0
  473. data/ext/common/Utils/json-forwards.h +249 -0
  474. data/ext/common/Utils/json.h +1855 -0
  475. data/ext/common/Utils/jsoncpp.cpp +4230 -0
  476. data/ext/common/agents/Base.cpp +1126 -0
  477. data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
  478. data/ext/common/agents/EnvPrinter.c +16 -0
  479. data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
  480. data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
  481. data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
  482. data/ext/common/agents/HelperAgent/Main.cpp +497 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
  484. data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
  485. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
  486. data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
  487. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
  488. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
  489. data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
  490. data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
  491. data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
  492. data/ext/common/agents/SpawnPreparer.cpp +127 -0
  493. data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
  494. data/ext/libeio/Changes +72 -0
  495. data/ext/{google/COPYING → libeio/LICENSE} +17 -9
  496. data/ext/libeio/Makefile.am +15 -0
  497. data/ext/libeio/Makefile.in +694 -0
  498. data/ext/libeio/aclocal.m4 +9418 -0
  499. data/ext/libeio/autogen.sh +3 -0
  500. data/ext/libeio/config.guess +1501 -0
  501. data/ext/libeio/config.h.in +136 -0
  502. data/ext/libeio/config.sub +1705 -0
  503. data/ext/libeio/configure +14822 -0
  504. data/ext/libeio/configure.ac +22 -0
  505. data/ext/libeio/demo.c +194 -0
  506. data/ext/libeio/ecb.h +457 -0
  507. data/ext/libeio/eio.c +2816 -0
  508. data/ext/libeio/eio.h +411 -0
  509. data/ext/libeio/install-sh +520 -0
  510. data/ext/libeio/libeio.m4 +211 -0
  511. data/ext/libeio/ltmain.sh +9636 -0
  512. data/ext/libeio/missing +376 -0
  513. data/ext/libeio/xthread.h +166 -0
  514. data/ext/libev/Changes +125 -7
  515. data/ext/libev/Makefile.am +5 -3
  516. data/ext/libev/Makefile.in +209 -120
  517. data/ext/libev/aclocal.m4 +6027 -4619
  518. data/ext/libev/autogen.sh +1 -4
  519. data/ext/libev/config.h.in +11 -7
  520. data/ext/libev/configure +7312 -14993
  521. data/ext/libev/configure.ac +12 -5
  522. data/ext/libev/depcomp +630 -0
  523. data/ext/libev/ev++.h +48 -32
  524. data/ext/libev/ev.c +1173 -391
  525. data/ext/libev/ev.h +315 -181
  526. data/ext/libev/ev_epoll.c +66 -15
  527. data/ext/libev/ev_kqueue.c +20 -18
  528. data/ext/libev/ev_poll.c +27 -23
  529. data/ext/libev/ev_port.c +39 -19
  530. data/ext/libev/ev_select.c +23 -17
  531. data/ext/libev/ev_vars.h +25 -8
  532. data/ext/libev/ev_win32.c +6 -6
  533. data/ext/libev/ev_wrap.h +22 -2
  534. data/ext/libev/event.c +18 -17
  535. data/ext/libev/event.h +16 -4
  536. data/ext/libev/libev.m4 +10 -6
  537. data/ext/libev/ltmain.sh +7353 -5811
  538. data/ext/nginx/Configuration.c +74 -42
  539. data/ext/nginx/Configuration.h +3 -5
  540. data/ext/nginx/ContentHandler.c +26 -83
  541. data/ext/nginx/ContentHandler.h +1 -1
  542. data/ext/nginx/config +13 -9
  543. data/ext/nginx/ngx_http_passenger_module.c +3 -7
  544. data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
  545. data/ext/oxt/detail/context.hpp +90 -0
  546. data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
  547. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
  548. data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
  549. data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
  550. data/ext/oxt/dynamic_thread_group.hpp +27 -1
  551. data/ext/oxt/implementation.cpp +415 -0
  552. data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
  553. data/ext/oxt/macros.hpp +32 -1
  554. data/ext/oxt/spin_lock.hpp +6 -11
  555. data/ext/oxt/system_calls.cpp +204 -16
  556. data/ext/oxt/system_calls.hpp +85 -45
  557. data/ext/oxt/thread.hpp +13 -117
  558. data/ext/ruby/passenger_native_support.c +82 -237
  559. data/helper-scripts/backtrace-sanitizer.rb +114 -0
  560. data/helper-scripts/classic-rails-loader.rb +135 -0
  561. data/helper-scripts/classic-rails-preloader.rb +161 -0
  562. data/helper-scripts/node-loader.js +314 -0
  563. data/helper-scripts/rack-loader.rb +104 -0
  564. data/helper-scripts/rack-preloader.rb +132 -0
  565. data/helper-scripts/wsgi-loader.py +231 -0
  566. data/helper-scripts/wsgi-preloader.py +1 -0
  567. data/lib/phusion_passenger.rb +159 -61
  568. data/lib/phusion_passenger/abstract_installer.rb +182 -87
  569. data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
  570. data/lib/phusion_passenger/analytics_logger.rb +5 -4
  571. data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
  572. data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
  573. data/lib/phusion_passenger/common_library.rb +441 -0
  574. data/lib/phusion_passenger/console_text_template.rb +4 -16
  575. data/lib/phusion_passenger/constants.rb +1 -8
  576. data/lib/phusion_passenger/debug_logging.rb +5 -2
  577. data/lib/phusion_passenger/dependencies.rb +51 -13
  578. data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
  579. data/lib/phusion_passenger/message_channel.rb +3 -47
  580. data/lib/phusion_passenger/message_client.rb +2 -2
  581. data/lib/phusion_passenger/native_support.rb +36 -15
  582. data/lib/phusion_passenger/packaging.rb +8 -11
  583. data/lib/phusion_passenger/platform_info.rb +25 -17
  584. data/lib/phusion_passenger/platform_info/apache.rb +10 -7
  585. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
  586. data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
  587. data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
  588. data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
  589. data/lib/phusion_passenger/public_api.rb +1 -4
  590. data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
  591. data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
  592. data/lib/phusion_passenger/request_handler.rb +500 -0
  593. data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
  594. data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
  595. data/lib/phusion_passenger/standalone/command.rb +36 -15
  596. data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
  597. data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
  598. data/lib/phusion_passenger/standalone/start_command.rb +44 -39
  599. data/lib/phusion_passenger/standalone/utils.rb +5 -5
  600. data/lib/phusion_passenger/utils.rb +35 -914
  601. data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
  602. data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  603. data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
  604. data/lib/phusion_passenger/utils/tee_input.rb +174 -0
  605. data/lib/phusion_passenger/utils/tmpio.rb +33 -0
  606. data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
  607. data/resources/mime.types +5 -1
  608. data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
  609. data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  610. data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
  611. data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
  612. data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
  613. data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  614. data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
  615. data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
  616. data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
  617. data/resources/templates/error_layout.html.template +89 -0
  618. data/resources/templates/general_error.html.template +1 -0
  619. data/resources/templates/general_error_with_html.html.template +1 -0
  620. data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
  621. data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
  622. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
  623. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
  624. data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
  625. data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
  626. data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
  627. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
  628. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
  629. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  630. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  631. data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
  632. data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
  633. data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
  634. data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
  635. data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
  636. data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  637. data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
  638. data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
  639. data/resources/templates/undisclosed_error.html.template +25 -0
  640. data/test/config.json.example +42 -0
  641. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
  642. data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
  643. data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
  644. data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
  645. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
  646. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
  647. data/test/cxx/BufferedIOTest.cpp +7 -7
  648. data/test/cxx/CxxTestMain.cpp +65 -2
  649. data/test/cxx/FileBackedPipeTest.cpp +626 -0
  650. data/test/cxx/FileChangeCheckerTest.cpp +20 -18
  651. data/test/cxx/FilterSupportTest.cpp +5 -5
  652. data/test/cxx/IOUtilsTest.cpp +11 -4
  653. data/test/cxx/MessageReadersWritersTest.cpp +1 -1
  654. data/test/cxx/MessageServerTest.cpp +31 -30
  655. data/test/cxx/RequestHandlerTest.cpp +777 -0
  656. data/test/cxx/ScgiRequestParserTest.cpp +36 -16
  657. data/test/cxx/ServerInstanceDirTest.cpp +1 -1
  658. data/test/cxx/StringMapTest.cpp +61 -0
  659. data/test/cxx/TemplateTest.cpp +118 -0
  660. data/test/cxx/TestSupport.cpp +25 -68
  661. data/test/cxx/TestSupport.h +81 -41
  662. data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
  663. data/test/cxx/UtilsTest.cpp +59 -5
  664. data/test/integration_tests/apache2_tests.rb +2 -2
  665. data/test/integration_tests/nginx_tests.rb +1 -1
  666. data/test/integration_tests/spec_helper.rb +7 -5
  667. data/test/oxt/oxt_test_main.cpp +2 -0
  668. data/test/oxt/syscall_interruption_test.cpp +1 -0
  669. data/test/ruby/classic_rails/loader_spec.rb +48 -0
  670. data/test/ruby/classic_rails/preloader_spec.rb +54 -0
  671. data/test/ruby/rack/loader_spec.rb +62 -0
  672. data/test/ruby/rack/preloader_spec.rb +74 -0
  673. data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
  674. data/test/ruby/shared/loader_spec.rb +241 -0
  675. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
  676. data/test/ruby/shared/ruby_loader_spec.rb +55 -0
  677. data/test/ruby/spec_helper.rb +8 -53
  678. data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
  679. data/test/ruby/utils_spec.rb +10 -683
  680. data/test/stub/rack/config.ru +28 -3
  681. data/test/stub/rack/start.rb +47 -0
  682. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
  683. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
  684. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
  685. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
  686. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
  687. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
  688. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
  689. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
  690. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
  691. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
  692. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
  693. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
  694. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
  695. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
  696. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
  697. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
  698. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
  699. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
  700. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
  701. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
  702. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
  703. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
  704. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
  705. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
  706. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
  707. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
  708. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
  709. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
  710. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
  711. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
  712. data/test/stub/rails3.0/Gemfile.lock +80 -0
  713. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
  714. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
  715. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
  716. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
  717. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
  718. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
  719. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
  720. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
  721. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
  722. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
  723. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
  724. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
  725. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
  726. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
  727. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
  728. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
  729. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
  730. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
  731. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
  732. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
  733. data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
  734. data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
  735. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
  736. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
  737. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
  738. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
  739. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
  740. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
  741. data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
  742. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
  743. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
  744. data/test/stub/start_error.pl +24 -0
  745. data/test/stub/wsgi/passenger_wsgi.py +71 -3
  746. data/test/support/apache2_controller.rb +2 -2
  747. data/test/support/placebo-preloader.rb +88 -0
  748. data/test/support/test_helper.rb +1 -14
  749. data/test/tut/tut.h +11 -4
  750. metadata +590 -326
  751. data.tar.gz.asc +0 -12
  752. data/PACKAGING.TXT +0 -25
  753. data/build/config.rb +0 -46
  754. data/ext/apache2/HelperAgent.cpp +0 -364
  755. data/ext/boost/call_traits.hpp +0 -24
  756. data/ext/boost/detail/call_traits.hpp +0 -164
  757. data/ext/common/AbstractSpawnManager.h +0 -110
  758. data/ext/common/AgentBase.cpp +0 -432
  759. data/ext/common/ApplicationPool/Client.h +0 -788
  760. data/ext/common/ApplicationPool/Interface.h +0 -295
  761. data/ext/common/ApplicationPool/Pool.h +0 -1327
  762. data/ext/common/ApplicationPool/Server.h +0 -479
  763. data/ext/common/MessageChannel.h +0 -494
  764. data/ext/common/PoolOptions.h +0 -518
  765. data/ext/common/Process.h +0 -253
  766. data/ext/common/Session.h +0 -436
  767. data/ext/common/SpawnManager.h +0 -611
  768. data/ext/google/ChangeLog +0 -167
  769. data/ext/google/dense_hash_map +0 -310
  770. data/ext/google/dense_hash_set +0 -287
  771. data/ext/google/sparse_hash_map +0 -294
  772. data/ext/google/sparse_hash_set +0 -275
  773. data/ext/google/sparsehash/densehashtable.h +0 -1062
  774. data/ext/google/sparsehash/sparseconfig.h +0 -55
  775. data/ext/google/sparsehash/sparsehashtable.h +0 -1015
  776. data/ext/google/sparsetable +0 -1468
  777. data/ext/google/type_traits.h +0 -250
  778. data/ext/nginx/HelperAgent.cpp +0 -1355
  779. data/ext/nginx/ScgiRequestParser.h +0 -375
  780. data/ext/oxt/backtrace.cpp +0 -185
  781. data/ext/oxt/tracable_exception.cpp +0 -89
  782. data/helper-scripts/passenger-spawn-server +0 -106
  783. data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
  784. data/lib/phusion_passenger/abstract_server.rb +0 -372
  785. data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
  786. data/lib/phusion_passenger/app_process.rb +0 -174
  787. data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
  788. data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
  789. data/lib/phusion_passenger/exceptions.rb +0 -103
  790. data/lib/phusion_passenger/html_template.rb +0 -107
  791. data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
  792. data/lib/phusion_passenger/spawn_manager.rb +0 -359
  793. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
  794. data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
  795. data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
  796. data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
  797. data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
  798. data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
  799. data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
  800. data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
  801. data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
  802. data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
  803. data/test/config.yml.example +0 -41
  804. data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
  805. data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
  806. data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
  807. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
  808. data/test/cxx/MessageChannelTest.cpp +0 -557
  809. data/test/cxx/PoolOptionsTest.cpp +0 -116
  810. data/test/cxx/SpawnManagerTest.cpp +0 -161
  811. data/test/ruby/abstract_server_collection_spec.rb +0 -247
  812. data/test/ruby/abstract_server_spec.rb +0 -61
  813. data/test/ruby/app_process_spec.rb +0 -43
  814. data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
  815. data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
  816. data/test/ruby/rack/application_spawner_spec.rb +0 -116
  817. data/test/ruby/shared/abstract_server_spec.rb +0 -23
  818. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
  819. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
  820. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
  821. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
  822. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
  823. data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
  824. data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
  825. data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
  826. data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
  827. data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
  828. data/test/ruby/spawn_manager_spec.rb +0 -134
  829. data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
  830. data/test/stub/message_channel.rb +0 -11
  831. data/test/stub/message_channel_2.rb +0 -12
  832. data/test/stub/message_channel_3.rb +0 -19
  833. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
  834. data/test/stub/spawn_server.rb +0 -22
  835. metadata.gz.asc +0 -12
@@ -0,0 +1,101 @@
1
+ /*-
2
+ * Copyright 1997, 1998-2003 John-Mark Gurney.
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
+ * SUCH DAMAGE.
25
+ *
26
+ * $Id: fib.h,v 1.10 2003/01/14 10:11:30 jmg Exp $
27
+ *
28
+ */
29
+
30
+ #ifndef _FIB_H_
31
+ #define _FIB_H_
32
+
33
+ #ifdef __cplusplus
34
+ extern "C" {
35
+ #endif /* __cplusplus */
36
+
37
+ struct fibheap_el;
38
+ typedef int (*voidcmp)(void *, void *);
39
+
40
+ struct fibheap {
41
+ int (*fh_cmp_fnct)(void *, void *);
42
+ int fh_n;
43
+ int fh_Dl;
44
+ struct fibheap_el **fh_cons;
45
+ struct fibheap_el *fh_min;
46
+ struct fibheap_el *fh_root;
47
+ void *fh_neginf;
48
+ int fh_keys : 1;
49
+ #ifdef FH_STATS
50
+ int fh_maxn;
51
+ int fh_ninserts;
52
+ int fh_nextracts;
53
+ #endif
54
+ };
55
+
56
+ struct fibheap_el {
57
+ int fhe_degree;
58
+ int fhe_mark;
59
+ struct fibheap_el *fhe_p;
60
+ struct fibheap_el *fhe_child;
61
+ struct fibheap_el *fhe_left;
62
+ struct fibheap_el *fhe_right;
63
+ int fhe_key;
64
+ void *fhe_data;
65
+ };
66
+
67
+ /* functions for key heaps */
68
+ struct fibheap *fh_makekeyheap(void);
69
+ void fh_initheap(struct fibheap *);
70
+ struct fibheap_el *fh_insertkey(struct fibheap *, int, void *);
71
+ int fh_minkey(struct fibheap *);
72
+ int fh_replacekey(struct fibheap *, struct fibheap_el *, int);
73
+ void *fh_replacekeydata(struct fibheap *, struct fibheap_el *, int, void *);
74
+
75
+ /* functions for void * heaps */
76
+ struct fibheap *fh_makeheap(void);
77
+ voidcmp fh_setcmp(struct fibheap *, voidcmp);
78
+ void *fh_setneginf(struct fibheap *, void *);
79
+ struct fibheap_el *fh_insert(struct fibheap *, void *);
80
+
81
+ /* shared functions */
82
+ void *fh_extractmin(struct fibheap *);
83
+ void *fh_min(struct fibheap *);
84
+ void *fh_replacedata(struct fibheap *, struct fibheap_el *, void *);
85
+ void *fh_delete(struct fibheap *, struct fibheap_el *);
86
+ void fh_deleteheap(struct fibheap *);
87
+ void fh_destroyheap(struct fibheap *h);
88
+ /* this assumes both heaps are allocated on the heap */
89
+ struct fibheap *fh_union(struct fibheap *, struct fibheap *);
90
+
91
+ #ifdef FH_STATS
92
+ int fh_maxn(struct fibheap *);
93
+ int fh_ninserts(struct fibheap *);
94
+ int fh_nextracts(struct fibheap *);
95
+ #endif
96
+
97
+ #ifdef __cplusplus
98
+ }
99
+ #endif /* __cplusplus */
100
+
101
+ #endif /* _FIB_H_ */
@@ -0,0 +1,67 @@
1
+ /*-
2
+ * Copyright 1997, 1999-2003 John-Mark Gurney.
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions
7
+ * are met:
8
+ * 1. Redistributions of source code must retain the above copyright
9
+ * notice, this list of conditions and the following disclaimer.
10
+ * 2. Redistributions in binary form must reproduce the above copyright
11
+ * notice, this list of conditions and the following disclaimer in the
12
+ * documentation and/or other materials provided with the distribution.
13
+ *
14
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
+ * SUCH DAMAGE.
25
+ *
26
+ * $Id: fibpriv.h,v 1.12 2003/01/14 10:11:30 jmg Exp $
27
+ *
28
+ */
29
+
30
+ #ifndef _FIBPRIV_H_
31
+ #define _FIBPRIV_H_
32
+
33
+ /*
34
+ * global heap operations
35
+ */
36
+ static void fh_insertrootlist(struct fibheap *, struct fibheap_el *);
37
+ static void fh_removerootlist(struct fibheap *, struct fibheap_el *);
38
+ static void fh_consolidate(struct fibheap *);
39
+ static void fh_heaplink(struct fibheap *h, struct fibheap_el *y,
40
+ struct fibheap_el *x);
41
+ static void fh_cut(struct fibheap *, struct fibheap_el *, struct fibheap_el *);
42
+ static void fh_cascading_cut(struct fibheap *, struct fibheap_el *);
43
+ static struct fibheap_el *fh_extractminel(struct fibheap *);
44
+ static void fh_checkcons(struct fibheap *h);
45
+ static int fh_compare(struct fibheap *h, struct fibheap_el *a,
46
+ struct fibheap_el *b);
47
+ static int fh_comparedata(struct fibheap *h, int key, void *data,
48
+ struct fibheap_el *b);
49
+ static void fh_insertel(struct fibheap *h, struct fibheap_el *x);
50
+ static void fh_deleteel(struct fibheap *h, struct fibheap_el *x);
51
+
52
+ /*
53
+ * specific node operations
54
+ */
55
+ static struct fibheap_el *fhe_newelem(void);
56
+ static void fhe_initelem(struct fibheap_el *);
57
+ static void fhe_insertafter(struct fibheap_el *a, struct fibheap_el *b);
58
+ static inline void fhe_insertbefore(struct fibheap_el *a, struct fibheap_el *b);
59
+ static struct fibheap_el *fhe_remove(struct fibheap_el *a);
60
+ #define fhe_destroy(x) free((x))
61
+
62
+ /*
63
+ * general functions
64
+ */
65
+ static inline int ceillog2(unsigned int a);
66
+
67
+ #endif /* _FIBPRIV_H_ */
@@ -0,0 +1,249 @@
1
+ /// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/).
2
+ /// It is intented to be used with #include <json/json-forwards.h>
3
+ /// This header provides forward declaration for all JsonCpp types.
4
+
5
+ // //////////////////////////////////////////////////////////////////////
6
+ // Beginning of content of file: LICENSE
7
+ // //////////////////////////////////////////////////////////////////////
8
+
9
+ /*
10
+ The JsonCpp library's source code, including accompanying documentation,
11
+ tests and demonstration applications, are licensed under the following
12
+ conditions...
13
+
14
+ The author (Baptiste Lepilleur) explicitly disclaims copyright in all
15
+ jurisdictions which recognize such a disclaimer. In such jurisdictions,
16
+ this software is released into the Public Domain.
17
+
18
+ In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
19
+ 2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
20
+ released under the terms of the MIT License (see below).
21
+
22
+ In jurisdictions which recognize Public Domain property, the user of this
23
+ software may choose to accept it either as 1) Public Domain, 2) under the
24
+ conditions of the MIT License (see below), or 3) under the terms of dual
25
+ Public Domain/MIT License conditions described here, as they choose.
26
+
27
+ The MIT License is about as close to Public Domain as a license can get, and is
28
+ described in clear, concise terms at:
29
+
30
+ http://en.wikipedia.org/wiki/MIT_License
31
+
32
+ The full text of the MIT License follows:
33
+
34
+ ========================================================================
35
+ Copyright (c) 2007-2010 Baptiste Lepilleur
36
+
37
+ Permission is hereby granted, free of charge, to any person
38
+ obtaining a copy of this software and associated documentation
39
+ files (the "Software"), to deal in the Software without
40
+ restriction, including without limitation the rights to use, copy,
41
+ modify, merge, publish, distribute, sublicense, and/or sell copies
42
+ of the Software, and to permit persons to whom the Software is
43
+ furnished to do so, subject to the following conditions:
44
+
45
+ The above copyright notice and this permission notice shall be
46
+ included in all copies or substantial portions of the Software.
47
+
48
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
49
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
50
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
51
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
52
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
54
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55
+ SOFTWARE.
56
+ ========================================================================
57
+ (END LICENSE TEXT)
58
+
59
+ The MIT license is compatible with both the GPL and commercial
60
+ software, affording one all of the rights of Public Domain with the
61
+ minor nuisance of being required to keep the above copyright notice
62
+ and license text in the source code. Note also that by accepting the
63
+ Public Domain "license" you can re-license your copy using whatever
64
+ license you like.
65
+
66
+ */
67
+
68
+ // //////////////////////////////////////////////////////////////////////
69
+ // End of content of file: LICENSE
70
+ // //////////////////////////////////////////////////////////////////////
71
+
72
+
73
+
74
+
75
+
76
+ #ifndef JSON_FORWARD_AMALGATED_H_INCLUDED
77
+ # define JSON_FORWARD_AMALGATED_H_INCLUDED
78
+ /// If defined, indicates that the source file is amalgated
79
+ /// to prevent private header inclusion.
80
+ #define JSON_IS_AMALGATED
81
+
82
+ // //////////////////////////////////////////////////////////////////////
83
+ // Beginning of content of file: include/json/config.h
84
+ // //////////////////////////////////////////////////////////////////////
85
+
86
+ // Copyright 2007-2010 Baptiste Lepilleur
87
+ // Distributed under MIT license, or public domain if desired and
88
+ // recognized in your jurisdiction.
89
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
90
+
91
+ #ifndef JSON_CONFIG_H_INCLUDED
92
+ # define JSON_CONFIG_H_INCLUDED
93
+
94
+ /// If defined, indicates that json library is embedded in CppTL library.
95
+ //# define JSON_IN_CPPTL 1
96
+
97
+ /// If defined, indicates that json may leverage CppTL library
98
+ //# define JSON_USE_CPPTL 1
99
+ /// If defined, indicates that cpptl vector based map should be used instead of std::map
100
+ /// as Value container.
101
+ //# define JSON_USE_CPPTL_SMALLMAP 1
102
+ /// If defined, indicates that Json specific container should be used
103
+ /// (hash table & simple deque container with customizable allocator).
104
+ /// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332
105
+ //# define JSON_VALUE_USE_INTERNAL_MAP 1
106
+ /// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
107
+ /// The memory pools allocator used optimization (initializing Value and ValueInternalLink
108
+ /// as if it was a POD) that may cause some validation tool to report errors.
109
+ /// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
110
+ //# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
111
+
112
+ /// If defined, indicates that Json use exception to report invalid type manipulation
113
+ /// instead of C assert macro.
114
+ # define JSON_USE_EXCEPTION 1
115
+
116
+ /// If defined, indicates that the source file is amalgated
117
+ /// to prevent private header inclusion.
118
+ /// Remarks: it is automatically defined in the generated amalgated header.
119
+ #define JSON_IS_AMALGAMATION
120
+
121
+
122
+ # ifdef JSON_IN_CPPTL
123
+ # include <cpptl/config.h>
124
+ # ifndef JSON_USE_CPPTL
125
+ # define JSON_USE_CPPTL 1
126
+ # endif
127
+ # endif
128
+
129
+ # ifdef JSON_IN_CPPTL
130
+ # define JSON_API CPPTL_API
131
+ # elif defined(JSON_DLL_BUILD)
132
+ # define JSON_API __declspec(dllexport)
133
+ # elif defined(JSON_DLL)
134
+ # define JSON_API __declspec(dllimport)
135
+ # else
136
+ # define JSON_API
137
+ # endif
138
+
139
+ // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer
140
+ // Storages, and 64 bits integer support is disabled.
141
+ // #define JSON_NO_INT64 1
142
+
143
+ #if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6
144
+ // Microsoft Visual Studio 6 only support conversion from __int64 to double
145
+ // (no conversion from unsigned __int64).
146
+ #define JSON_USE_INT64_DOUBLE_CONVERSION 1
147
+ #endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
148
+
149
+ #if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
150
+ /// Indicates that the following function is deprecated.
151
+ # define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
152
+ #endif
153
+
154
+ #if !defined(JSONCPP_DEPRECATED)
155
+ # define JSONCPP_DEPRECATED(message)
156
+ #endif // if !defined(JSONCPP_DEPRECATED)
157
+
158
+ namespace Json {
159
+ typedef int Int;
160
+ typedef unsigned int UInt;
161
+ # if defined(JSON_NO_INT64)
162
+ typedef int LargestInt;
163
+ typedef unsigned int LargestUInt;
164
+ # undef JSON_HAS_INT64
165
+ # else // if defined(JSON_NO_INT64)
166
+ // For Microsoft Visual use specific types as long long is not supported
167
+ # if defined(_MSC_VER) // Microsoft Visual Studio
168
+ typedef __int64 Int64;
169
+ typedef unsigned __int64 UInt64;
170
+ # else // if defined(_MSC_VER) // Other platforms, use long long
171
+ typedef long long int Int64;
172
+ typedef unsigned long long int UInt64;
173
+ # endif // if defined(_MSC_VER)
174
+ typedef Int64 LargestInt;
175
+ typedef UInt64 LargestUInt;
176
+ # define JSON_HAS_INT64
177
+ # endif // if defined(JSON_NO_INT64)
178
+ } // end namespace Json
179
+
180
+
181
+ #endif // JSON_CONFIG_H_INCLUDED
182
+
183
+ // //////////////////////////////////////////////////////////////////////
184
+ // End of content of file: include/json/config.h
185
+ // //////////////////////////////////////////////////////////////////////
186
+
187
+
188
+
189
+
190
+
191
+
192
+ // //////////////////////////////////////////////////////////////////////
193
+ // Beginning of content of file: include/json/forwards.h
194
+ // //////////////////////////////////////////////////////////////////////
195
+
196
+ // Copyright 2007-2010 Baptiste Lepilleur
197
+ // Distributed under MIT license, or public domain if desired and
198
+ // recognized in your jurisdiction.
199
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
200
+
201
+ #ifndef JSON_FORWARDS_H_INCLUDED
202
+ # define JSON_FORWARDS_H_INCLUDED
203
+
204
+ #if !defined(JSON_IS_AMALGAMATION)
205
+ # include "config.h"
206
+ #endif // if !defined(JSON_IS_AMALGAMATION)
207
+
208
+ namespace Json {
209
+
210
+ // writer.h
211
+ class FastWriter;
212
+ class StyledWriter;
213
+
214
+ // reader.h
215
+ class Reader;
216
+
217
+ // features.h
218
+ class Features;
219
+
220
+ // value.h
221
+ typedef unsigned int ArrayIndex;
222
+ class StaticString;
223
+ class Path;
224
+ class PathArgument;
225
+ class Value;
226
+ class ValueIteratorBase;
227
+ class ValueIterator;
228
+ class ValueConstIterator;
229
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
230
+ class ValueMapAllocator;
231
+ class ValueInternalLink;
232
+ class ValueInternalArray;
233
+ class ValueInternalMap;
234
+ #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
235
+
236
+ } // namespace Json
237
+
238
+
239
+ #endif // JSON_FORWARDS_H_INCLUDED
240
+
241
+ // //////////////////////////////////////////////////////////////////////
242
+ // End of content of file: include/json/forwards.h
243
+ // //////////////////////////////////////////////////////////////////////
244
+
245
+
246
+
247
+
248
+
249
+ #endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED
@@ -0,0 +1,1855 @@
1
+ /// Json-cpp amalgated header (http://jsoncpp.sourceforge.net/).
2
+ /// It is intented to be used with #include <json/json.h>
3
+
4
+ // //////////////////////////////////////////////////////////////////////
5
+ // Beginning of content of file: LICENSE
6
+ // //////////////////////////////////////////////////////////////////////
7
+
8
+ /*
9
+ The JsonCpp library's source code, including accompanying documentation,
10
+ tests and demonstration applications, are licensed under the following
11
+ conditions...
12
+
13
+ The author (Baptiste Lepilleur) explicitly disclaims copyright in all
14
+ jurisdictions which recognize such a disclaimer. In such jurisdictions,
15
+ this software is released into the Public Domain.
16
+
17
+ In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
18
+ 2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
19
+ released under the terms of the MIT License (see below).
20
+
21
+ In jurisdictions which recognize Public Domain property, the user of this
22
+ software may choose to accept it either as 1) Public Domain, 2) under the
23
+ conditions of the MIT License (see below), or 3) under the terms of dual
24
+ Public Domain/MIT License conditions described here, as they choose.
25
+
26
+ The MIT License is about as close to Public Domain as a license can get, and is
27
+ described in clear, concise terms at:
28
+
29
+ http://en.wikipedia.org/wiki/MIT_License
30
+
31
+ The full text of the MIT License follows:
32
+
33
+ ========================================================================
34
+ Copyright (c) 2007-2010 Baptiste Lepilleur
35
+
36
+ Permission is hereby granted, free of charge, to any person
37
+ obtaining a copy of this software and associated documentation
38
+ files (the "Software"), to deal in the Software without
39
+ restriction, including without limitation the rights to use, copy,
40
+ modify, merge, publish, distribute, sublicense, and/or sell copies
41
+ of the Software, and to permit persons to whom the Software is
42
+ furnished to do so, subject to the following conditions:
43
+
44
+ The above copyright notice and this permission notice shall be
45
+ included in all copies or substantial portions of the Software.
46
+
47
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
48
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
49
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
50
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
51
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
54
+ SOFTWARE.
55
+ ========================================================================
56
+ (END LICENSE TEXT)
57
+
58
+ The MIT license is compatible with both the GPL and commercial
59
+ software, affording one all of the rights of Public Domain with the
60
+ minor nuisance of being required to keep the above copyright notice
61
+ and license text in the source code. Note also that by accepting the
62
+ Public Domain "license" you can re-license your copy using whatever
63
+ license you like.
64
+
65
+ */
66
+
67
+ // //////////////////////////////////////////////////////////////////////
68
+ // End of content of file: LICENSE
69
+ // //////////////////////////////////////////////////////////////////////
70
+
71
+
72
+
73
+
74
+
75
+ #ifndef JSON_AMALGATED_H_INCLUDED
76
+ # define JSON_AMALGATED_H_INCLUDED
77
+ /// If defined, indicates that the source file is amalgated
78
+ /// to prevent private header inclusion.
79
+ #define JSON_IS_AMALGATED
80
+
81
+ // //////////////////////////////////////////////////////////////////////
82
+ // Beginning of content of file: include/json/config.h
83
+ // //////////////////////////////////////////////////////////////////////
84
+
85
+ // Copyright 2007-2010 Baptiste Lepilleur
86
+ // Distributed under MIT license, or public domain if desired and
87
+ // recognized in your jurisdiction.
88
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
89
+
90
+ #ifndef JSON_CONFIG_H_INCLUDED
91
+ # define JSON_CONFIG_H_INCLUDED
92
+
93
+ /// If defined, indicates that json library is embedded in CppTL library.
94
+ //# define JSON_IN_CPPTL 1
95
+
96
+ /// If defined, indicates that json may leverage CppTL library
97
+ //# define JSON_USE_CPPTL 1
98
+ /// If defined, indicates that cpptl vector based map should be used instead of std::map
99
+ /// as Value container.
100
+ //# define JSON_USE_CPPTL_SMALLMAP 1
101
+ /// If defined, indicates that Json specific container should be used
102
+ /// (hash table & simple deque container with customizable allocator).
103
+ /// THIS FEATURE IS STILL EXPERIMENTAL! There is know bugs: See #3177332
104
+ //# define JSON_VALUE_USE_INTERNAL_MAP 1
105
+ /// Force usage of standard new/malloc based allocator instead of memory pool based allocator.
106
+ /// The memory pools allocator used optimization (initializing Value and ValueInternalLink
107
+ /// as if it was a POD) that may cause some validation tool to report errors.
108
+ /// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined.
109
+ //# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1
110
+
111
+ /// If defined, indicates that Json use exception to report invalid type manipulation
112
+ /// instead of C assert macro.
113
+ # define JSON_USE_EXCEPTION 1
114
+
115
+ /// If defined, indicates that the source file is amalgated
116
+ /// to prevent private header inclusion.
117
+ /// Remarks: it is automatically defined in the generated amalgated header.
118
+ #define JSON_IS_AMALGAMATION
119
+
120
+
121
+ # ifdef JSON_IN_CPPTL
122
+ # include <cpptl/config.h>
123
+ # ifndef JSON_USE_CPPTL
124
+ # define JSON_USE_CPPTL 1
125
+ # endif
126
+ # endif
127
+
128
+ # ifdef JSON_IN_CPPTL
129
+ # define JSON_API CPPTL_API
130
+ # elif defined(JSON_DLL_BUILD)
131
+ # define JSON_API __declspec(dllexport)
132
+ # elif defined(JSON_DLL)
133
+ # define JSON_API __declspec(dllimport)
134
+ # else
135
+ # define JSON_API
136
+ # endif
137
+
138
+ // If JSON_NO_INT64 is defined, then Json only support C++ "int" type for integer
139
+ // Storages, and 64 bits integer support is disabled.
140
+ // #define JSON_NO_INT64 1
141
+
142
+ #if defined(_MSC_VER) && _MSC_VER <= 1200 // MSVC 6
143
+ // Microsoft Visual Studio 6 only support conversion from __int64 to double
144
+ // (no conversion from unsigned __int64).
145
+ #define JSON_USE_INT64_DOUBLE_CONVERSION 1
146
+ #endif // if defined(_MSC_VER) && _MSC_VER < 1200 // MSVC 6
147
+
148
+ #if defined(_MSC_VER) && _MSC_VER >= 1500 // MSVC 2008
149
+ /// Indicates that the following function is deprecated.
150
+ # define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
151
+ #endif
152
+
153
+ #if !defined(JSONCPP_DEPRECATED)
154
+ # define JSONCPP_DEPRECATED(message)
155
+ #endif // if !defined(JSONCPP_DEPRECATED)
156
+
157
+ namespace Json {
158
+ typedef int Int;
159
+ typedef unsigned int UInt;
160
+ # if defined(JSON_NO_INT64)
161
+ typedef int LargestInt;
162
+ typedef unsigned int LargestUInt;
163
+ # undef JSON_HAS_INT64
164
+ # else // if defined(JSON_NO_INT64)
165
+ // For Microsoft Visual use specific types as long long is not supported
166
+ # if defined(_MSC_VER) // Microsoft Visual Studio
167
+ typedef __int64 Int64;
168
+ typedef unsigned __int64 UInt64;
169
+ # else // if defined(_MSC_VER) // Other platforms, use long long
170
+ typedef long long int Int64;
171
+ typedef unsigned long long int UInt64;
172
+ # endif // if defined(_MSC_VER)
173
+ typedef Int64 LargestInt;
174
+ typedef UInt64 LargestUInt;
175
+ # define JSON_HAS_INT64
176
+ # endif // if defined(JSON_NO_INT64)
177
+ } // end namespace Json
178
+
179
+
180
+ #endif // JSON_CONFIG_H_INCLUDED
181
+
182
+ // //////////////////////////////////////////////////////////////////////
183
+ // End of content of file: include/json/config.h
184
+ // //////////////////////////////////////////////////////////////////////
185
+
186
+
187
+
188
+
189
+
190
+
191
+ // //////////////////////////////////////////////////////////////////////
192
+ // Beginning of content of file: include/json/forwards.h
193
+ // //////////////////////////////////////////////////////////////////////
194
+
195
+ // Copyright 2007-2010 Baptiste Lepilleur
196
+ // Distributed under MIT license, or public domain if desired and
197
+ // recognized in your jurisdiction.
198
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
199
+
200
+ #ifndef JSON_FORWARDS_H_INCLUDED
201
+ # define JSON_FORWARDS_H_INCLUDED
202
+
203
+ #if !defined(JSON_IS_AMALGAMATION)
204
+ # include "config.h"
205
+ #endif // if !defined(JSON_IS_AMALGAMATION)
206
+
207
+ namespace Json {
208
+
209
+ // writer.h
210
+ class FastWriter;
211
+ class StyledWriter;
212
+
213
+ // reader.h
214
+ class Reader;
215
+
216
+ // features.h
217
+ class Features;
218
+
219
+ // value.h
220
+ typedef unsigned int ArrayIndex;
221
+ class StaticString;
222
+ class Path;
223
+ class PathArgument;
224
+ class Value;
225
+ class ValueIteratorBase;
226
+ class ValueIterator;
227
+ class ValueConstIterator;
228
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
229
+ class ValueMapAllocator;
230
+ class ValueInternalLink;
231
+ class ValueInternalArray;
232
+ class ValueInternalMap;
233
+ #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
234
+
235
+ } // namespace Json
236
+
237
+
238
+ #endif // JSON_FORWARDS_H_INCLUDED
239
+
240
+ // //////////////////////////////////////////////////////////////////////
241
+ // End of content of file: include/json/forwards.h
242
+ // //////////////////////////////////////////////////////////////////////
243
+
244
+
245
+
246
+
247
+
248
+
249
+ // //////////////////////////////////////////////////////////////////////
250
+ // Beginning of content of file: include/json/features.h
251
+ // //////////////////////////////////////////////////////////////////////
252
+
253
+ // Copyright 2007-2010 Baptiste Lepilleur
254
+ // Distributed under MIT license, or public domain if desired and
255
+ // recognized in your jurisdiction.
256
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
257
+
258
+ #ifndef CPPTL_JSON_FEATURES_H_INCLUDED
259
+ # define CPPTL_JSON_FEATURES_H_INCLUDED
260
+
261
+ #if !defined(JSON_IS_AMALGAMATION)
262
+ # include "forwards.h"
263
+ #endif // if !defined(JSON_IS_AMALGAMATION)
264
+
265
+ namespace Json {
266
+
267
+ /** \brief Configuration passed to reader and writer.
268
+ * This configuration object can be used to force the Reader or Writer
269
+ * to behave in a standard conforming way.
270
+ */
271
+ class JSON_API Features
272
+ {
273
+ public:
274
+ /** \brief A configuration that allows all features and assumes all strings are UTF-8.
275
+ * - C & C++ comments are allowed
276
+ * - Root object can be any JSON value
277
+ * - Assumes Value strings are encoded in UTF-8
278
+ */
279
+ static Features all();
280
+
281
+ /** \brief A configuration that is strictly compatible with the JSON specification.
282
+ * - Comments are forbidden.
283
+ * - Root object must be either an array or an object value.
284
+ * - Assumes Value strings are encoded in UTF-8
285
+ */
286
+ static Features strictMode();
287
+
288
+ /** \brief Initialize the configuration like JsonConfig::allFeatures;
289
+ */
290
+ Features();
291
+
292
+ /// \c true if comments are allowed. Default: \c true.
293
+ bool allowComments_;
294
+
295
+ /// \c true if root must be either an array or an object value. Default: \c false.
296
+ bool strictRoot_;
297
+ };
298
+
299
+ } // namespace Json
300
+
301
+ #endif // CPPTL_JSON_FEATURES_H_INCLUDED
302
+
303
+ // //////////////////////////////////////////////////////////////////////
304
+ // End of content of file: include/json/features.h
305
+ // //////////////////////////////////////////////////////////////////////
306
+
307
+
308
+
309
+
310
+
311
+
312
+ // //////////////////////////////////////////////////////////////////////
313
+ // Beginning of content of file: include/json/value.h
314
+ // //////////////////////////////////////////////////////////////////////
315
+
316
+ // Copyright 2007-2010 Baptiste Lepilleur
317
+ // Distributed under MIT license, or public domain if desired and
318
+ // recognized in your jurisdiction.
319
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
320
+
321
+ #ifndef CPPTL_JSON_H_INCLUDED
322
+ # define CPPTL_JSON_H_INCLUDED
323
+
324
+ #if !defined(JSON_IS_AMALGAMATION)
325
+ # include "forwards.h"
326
+ #endif // if !defined(JSON_IS_AMALGAMATION)
327
+ # include <string>
328
+ # include <vector>
329
+
330
+ # ifndef JSON_USE_CPPTL_SMALLMAP
331
+ # include <map>
332
+ # else
333
+ # include <cpptl/smallmap.h>
334
+ # endif
335
+ # ifdef JSON_USE_CPPTL
336
+ # include <cpptl/forwards.h>
337
+ # endif
338
+
339
+ /** \brief JSON (JavaScript Object Notation).
340
+ */
341
+ namespace Json {
342
+
343
+ /** \brief Type of the value held by a Value object.
344
+ */
345
+ enum ValueType
346
+ {
347
+ nullValue = 0, ///< 'null' value
348
+ intValue, ///< signed integer value
349
+ uintValue, ///< unsigned integer value
350
+ realValue, ///< double value
351
+ stringValue, ///< UTF-8 string value
352
+ booleanValue, ///< bool value
353
+ arrayValue, ///< array value (ordered list)
354
+ objectValue ///< object value (collection of name/value pairs).
355
+ };
356
+
357
+ enum CommentPlacement
358
+ {
359
+ commentBefore = 0, ///< a comment placed on the line before a value
360
+ commentAfterOnSameLine, ///< a comment just after a value on the same line
361
+ commentAfter, ///< a comment on the line after a value (only make sense for root value)
362
+ numberOfCommentPlacement
363
+ };
364
+
365
+ //# ifdef JSON_USE_CPPTL
366
+ // typedef CppTL::AnyEnumerator<const char *> EnumMemberNames;
367
+ // typedef CppTL::AnyEnumerator<const Value &> EnumValues;
368
+ //# endif
369
+
370
+ /** \brief Lightweight wrapper to tag static string.
371
+ *
372
+ * Value constructor and objectValue member assignement takes advantage of the
373
+ * StaticString and avoid the cost of string duplication when storing the
374
+ * string or the member name.
375
+ *
376
+ * Example of usage:
377
+ * \code
378
+ * Json::Value aValue( StaticString("some text") );
379
+ * Json::Value object;
380
+ * static const StaticString code("code");
381
+ * object[code] = 1234;
382
+ * \endcode
383
+ */
384
+ class JSON_API StaticString
385
+ {
386
+ public:
387
+ explicit StaticString( const char *czstring )
388
+ : str_( czstring )
389
+ {
390
+ }
391
+
392
+ operator const char *() const
393
+ {
394
+ return str_;
395
+ }
396
+
397
+ const char *c_str() const
398
+ {
399
+ return str_;
400
+ }
401
+
402
+ private:
403
+ const char *str_;
404
+ };
405
+
406
+ /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value.
407
+ *
408
+ * This class is a discriminated union wrapper that can represents a:
409
+ * - signed integer [range: Value::minInt - Value::maxInt]
410
+ * - unsigned integer (range: 0 - Value::maxUInt)
411
+ * - double
412
+ * - UTF-8 string
413
+ * - boolean
414
+ * - 'null'
415
+ * - an ordered list of Value
416
+ * - collection of name/value pairs (javascript object)
417
+ *
418
+ * The type of the held value is represented by a #ValueType and
419
+ * can be obtained using type().
420
+ *
421
+ * values of an #objectValue or #arrayValue can be accessed using operator[]() methods.
422
+ * Non const methods will automatically create the a #nullValue element
423
+ * if it does not exist.
424
+ * The sequence of an #arrayValue will be automatically resize and initialized
425
+ * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue.
426
+ *
427
+ * The get() methods can be used to obtanis default value in the case the required element
428
+ * does not exist.
429
+ *
430
+ * It is possible to iterate over the list of a #objectValue values using
431
+ * the getMemberNames() method.
432
+ */
433
+ class JSON_API Value
434
+ {
435
+ friend class ValueIteratorBase;
436
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
437
+ friend class ValueInternalLink;
438
+ friend class ValueInternalMap;
439
+ # endif
440
+ public:
441
+ typedef std::vector<std::string> Members;
442
+ typedef ValueIterator iterator;
443
+ typedef ValueConstIterator const_iterator;
444
+ typedef Json::UInt UInt;
445
+ typedef Json::Int Int;
446
+ # if defined(JSON_HAS_INT64)
447
+ typedef Json::UInt64 UInt64;
448
+ typedef Json::Int64 Int64;
449
+ #endif // defined(JSON_HAS_INT64)
450
+ typedef Json::LargestInt LargestInt;
451
+ typedef Json::LargestUInt LargestUInt;
452
+ typedef Json::ArrayIndex ArrayIndex;
453
+
454
+ static const Value null;
455
+ /// Minimum signed integer value that can be stored in a Json::Value.
456
+ static const LargestInt minLargestInt;
457
+ /// Maximum signed integer value that can be stored in a Json::Value.
458
+ static const LargestInt maxLargestInt;
459
+ /// Maximum unsigned integer value that can be stored in a Json::Value.
460
+ static const LargestUInt maxLargestUInt;
461
+
462
+ /// Minimum signed int value that can be stored in a Json::Value.
463
+ static const Int minInt;
464
+ /// Maximum signed int value that can be stored in a Json::Value.
465
+ static const Int maxInt;
466
+ /// Maximum unsigned int value that can be stored in a Json::Value.
467
+ static const UInt maxUInt;
468
+
469
+ /// Minimum signed 64 bits int value that can be stored in a Json::Value.
470
+ static const Int64 minInt64;
471
+ /// Maximum signed 64 bits int value that can be stored in a Json::Value.
472
+ static const Int64 maxInt64;
473
+ /// Maximum unsigned 64 bits int value that can be stored in a Json::Value.
474
+ static const UInt64 maxUInt64;
475
+
476
+ private:
477
+ #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
478
+ # ifndef JSON_VALUE_USE_INTERNAL_MAP
479
+ class CZString
480
+ {
481
+ public:
482
+ enum DuplicationPolicy
483
+ {
484
+ noDuplication = 0,
485
+ duplicate,
486
+ duplicateOnCopy
487
+ };
488
+ CZString( ArrayIndex index );
489
+ CZString( const char *cstr, DuplicationPolicy allocate );
490
+ CZString( const CZString &other );
491
+ ~CZString();
492
+ CZString &operator =( const CZString &other );
493
+ bool operator<( const CZString &other ) const;
494
+ bool operator==( const CZString &other ) const;
495
+ ArrayIndex index() const;
496
+ const char *c_str() const;
497
+ bool isStaticString() const;
498
+ private:
499
+ void swap( CZString &other );
500
+ const char *cstr_;
501
+ ArrayIndex index_;
502
+ };
503
+
504
+ public:
505
+ # ifndef JSON_USE_CPPTL_SMALLMAP
506
+ typedef std::map<CZString, Value> ObjectValues;
507
+ # else
508
+ typedef CppTL::SmallMap<CZString, Value> ObjectValues;
509
+ # endif // ifndef JSON_USE_CPPTL_SMALLMAP
510
+ # endif // ifndef JSON_VALUE_USE_INTERNAL_MAP
511
+ #endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
512
+
513
+ public:
514
+ /** \brief Create a default Value of the given type.
515
+
516
+ This is a very useful constructor.
517
+ To create an empty array, pass arrayValue.
518
+ To create an empty object, pass objectValue.
519
+ Another Value can then be set to this one by assignment.
520
+ This is useful since clear() and resize() will not alter types.
521
+
522
+ Examples:
523
+ \code
524
+ Json::Value null_value; // null
525
+ Json::Value arr_value(Json::arrayValue); // []
526
+ Json::Value obj_value(Json::objectValue); // {}
527
+ \endcode
528
+ */
529
+ Value( ValueType type = nullValue );
530
+ Value( Int value );
531
+ Value( UInt value );
532
+ #if defined(JSON_HAS_INT64)
533
+ Value( Int64 value );
534
+ Value( UInt64 value );
535
+ #endif // if defined(JSON_HAS_INT64)
536
+ Value( double value );
537
+ Value( const char *value );
538
+ Value( const char *beginValue, const char *endValue );
539
+ /** \brief Constructs a value from a static string.
540
+
541
+ * Like other value string constructor but do not duplicate the string for
542
+ * internal storage. The given string must remain alive after the call to this
543
+ * constructor.
544
+ * Example of usage:
545
+ * \code
546
+ * Json::Value aValue( StaticString("some text") );
547
+ * \endcode
548
+ */
549
+ Value( const StaticString &value );
550
+ Value( const std::string &value );
551
+ # ifdef JSON_USE_CPPTL
552
+ Value( const CppTL::ConstString &value );
553
+ # endif
554
+ Value( bool value );
555
+ Value( const Value &other );
556
+ ~Value();
557
+
558
+ Value &operator=( const Value &other );
559
+ /// Swap values.
560
+ /// \note Currently, comments are intentionally not swapped, for
561
+ /// both logic and efficiency.
562
+ void swap( Value &other );
563
+
564
+ ValueType type() const;
565
+
566
+ bool operator <( const Value &other ) const;
567
+ bool operator <=( const Value &other ) const;
568
+ bool operator >=( const Value &other ) const;
569
+ bool operator >( const Value &other ) const;
570
+
571
+ bool operator ==( const Value &other ) const;
572
+ bool operator !=( const Value &other ) const;
573
+
574
+ int compare( const Value &other ) const;
575
+
576
+ const char *asCString() const;
577
+ std::string asString() const;
578
+ # ifdef JSON_USE_CPPTL
579
+ CppTL::ConstString asConstString() const;
580
+ # endif
581
+ Int asInt() const;
582
+ UInt asUInt() const;
583
+ Int64 asInt64() const;
584
+ UInt64 asUInt64() const;
585
+ LargestInt asLargestInt() const;
586
+ LargestUInt asLargestUInt() const;
587
+ float asFloat() const;
588
+ double asDouble() const;
589
+ bool asBool() const;
590
+
591
+ bool isNull() const;
592
+ bool isBool() const;
593
+ bool isInt() const;
594
+ bool isUInt() const;
595
+ bool isIntegral() const;
596
+ bool isDouble() const;
597
+ bool isNumeric() const;
598
+ bool isString() const;
599
+ bool isArray() const;
600
+ bool isObject() const;
601
+
602
+ bool isConvertibleTo( ValueType other ) const;
603
+
604
+ /// Number of values in array or object
605
+ ArrayIndex size() const;
606
+
607
+ /// \brief Return true if empty array, empty object, or null;
608
+ /// otherwise, false.
609
+ bool empty() const;
610
+
611
+ /// Return isNull()
612
+ bool operator!() const;
613
+
614
+ /// Remove all object members and array elements.
615
+ /// \pre type() is arrayValue, objectValue, or nullValue
616
+ /// \post type() is unchanged
617
+ void clear();
618
+
619
+ /// Resize the array to size elements.
620
+ /// New elements are initialized to null.
621
+ /// May only be called on nullValue or arrayValue.
622
+ /// \pre type() is arrayValue or nullValue
623
+ /// \post type() is arrayValue
624
+ void resize( ArrayIndex size );
625
+
626
+ /// Access an array element (zero based index ).
627
+ /// If the array contains less than index element, then null value are inserted
628
+ /// in the array so that its size is index+1.
629
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
630
+ /// this from the operator[] which takes a string.)
631
+ Value &operator[]( ArrayIndex index );
632
+
633
+ /// Access an array element (zero based index ).
634
+ /// If the array contains less than index element, then null value are inserted
635
+ /// in the array so that its size is index+1.
636
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
637
+ /// this from the operator[] which takes a string.)
638
+ Value &operator[]( int index );
639
+
640
+ /// Access an array element (zero based index )
641
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
642
+ /// this from the operator[] which takes a string.)
643
+ const Value &operator[]( ArrayIndex index ) const;
644
+
645
+ /// Access an array element (zero based index )
646
+ /// (You may need to say 'value[0u]' to get your compiler to distinguish
647
+ /// this from the operator[] which takes a string.)
648
+ const Value &operator[]( int index ) const;
649
+
650
+ /// If the array contains at least index+1 elements, returns the element value,
651
+ /// otherwise returns defaultValue.
652
+ Value get( ArrayIndex index,
653
+ const Value &defaultValue ) const;
654
+ /// Return true if index < size().
655
+ bool isValidIndex( ArrayIndex index ) const;
656
+ /// \brief Append value to array at the end.
657
+ ///
658
+ /// Equivalent to jsonvalue[jsonvalue.size()] = value;
659
+ Value &append( const Value &value );
660
+
661
+ /// Access an object value by name, create a null member if it does not exist.
662
+ Value &operator[]( const char *key );
663
+ /// Access an object value by name, returns null if there is no member with that name.
664
+ const Value &operator[]( const char *key ) const;
665
+ /// Access an object value by name, create a null member if it does not exist.
666
+ Value &operator[]( const std::string &key );
667
+ /// Access an object value by name, returns null if there is no member with that name.
668
+ const Value &operator[]( const std::string &key ) const;
669
+ /** \brief Access an object value by name, create a null member if it does not exist.
670
+
671
+ * If the object as no entry for that name, then the member name used to store
672
+ * the new entry is not duplicated.
673
+ * Example of use:
674
+ * \code
675
+ * Json::Value object;
676
+ * static const StaticString code("code");
677
+ * object[code] = 1234;
678
+ * \endcode
679
+ */
680
+ Value &operator[]( const StaticString &key );
681
+ # ifdef JSON_USE_CPPTL
682
+ /// Access an object value by name, create a null member if it does not exist.
683
+ Value &operator[]( const CppTL::ConstString &key );
684
+ /// Access an object value by name, returns null if there is no member with that name.
685
+ const Value &operator[]( const CppTL::ConstString &key ) const;
686
+ # endif
687
+ /// Return the member named key if it exist, defaultValue otherwise.
688
+ Value get( const char *key,
689
+ const Value &defaultValue ) const;
690
+ /// Return the member named key if it exist, defaultValue otherwise.
691
+ Value get( const std::string &key,
692
+ const Value &defaultValue ) const;
693
+ # ifdef JSON_USE_CPPTL
694
+ /// Return the member named key if it exist, defaultValue otherwise.
695
+ Value get( const CppTL::ConstString &key,
696
+ const Value &defaultValue ) const;
697
+ # endif
698
+ /// \brief Remove and return the named member.
699
+ ///
700
+ /// Do nothing if it did not exist.
701
+ /// \return the removed Value, or null.
702
+ /// \pre type() is objectValue or nullValue
703
+ /// \post type() is unchanged
704
+ Value removeMember( const char* key );
705
+ /// Same as removeMember(const char*)
706
+ Value removeMember( const std::string &key );
707
+
708
+ /// Return true if the object has a member named key.
709
+ bool isMember( const char *key ) const;
710
+ /// Return true if the object has a member named key.
711
+ bool isMember( const std::string &key ) const;
712
+ # ifdef JSON_USE_CPPTL
713
+ /// Return true if the object has a member named key.
714
+ bool isMember( const CppTL::ConstString &key ) const;
715
+ # endif
716
+
717
+ /// \brief Return a list of the member names.
718
+ ///
719
+ /// If null, return an empty list.
720
+ /// \pre type() is objectValue or nullValue
721
+ /// \post if type() was nullValue, it remains nullValue
722
+ Members getMemberNames() const;
723
+
724
+ //# ifdef JSON_USE_CPPTL
725
+ // EnumMemberNames enumMemberNames() const;
726
+ // EnumValues enumValues() const;
727
+ //# endif
728
+
729
+ /// Comments must be //... or /* ... */
730
+ void setComment( const char *comment,
731
+ CommentPlacement placement );
732
+ /// Comments must be //... or /* ... */
733
+ void setComment( const std::string &comment,
734
+ CommentPlacement placement );
735
+ bool hasComment( CommentPlacement placement ) const;
736
+ /// Include delimiters and embedded newlines.
737
+ std::string getComment( CommentPlacement placement ) const;
738
+
739
+ std::string toStyledString() const;
740
+
741
+ const_iterator begin() const;
742
+ const_iterator end() const;
743
+
744
+ iterator begin();
745
+ iterator end();
746
+
747
+ private:
748
+ Value &resolveReference( const char *key,
749
+ bool isStatic );
750
+
751
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
752
+ inline bool isItemAvailable() const
753
+ {
754
+ return itemIsUsed_ == 0;
755
+ }
756
+
757
+ inline void setItemUsed( bool isUsed = true )
758
+ {
759
+ itemIsUsed_ = isUsed ? 1 : 0;
760
+ }
761
+
762
+ inline bool isMemberNameStatic() const
763
+ {
764
+ return memberNameIsStatic_ == 0;
765
+ }
766
+
767
+ inline void setMemberNameIsStatic( bool isStatic )
768
+ {
769
+ memberNameIsStatic_ = isStatic ? 1 : 0;
770
+ }
771
+ # endif // # ifdef JSON_VALUE_USE_INTERNAL_MAP
772
+
773
+ private:
774
+ struct CommentInfo
775
+ {
776
+ CommentInfo();
777
+ ~CommentInfo();
778
+
779
+ void setComment( const char *text );
780
+
781
+ char *comment_;
782
+ };
783
+
784
+ //struct MemberNamesTransform
785
+ //{
786
+ // typedef const char *result_type;
787
+ // const char *operator()( const CZString &name ) const
788
+ // {
789
+ // return name.c_str();
790
+ // }
791
+ //};
792
+
793
+ union ValueHolder
794
+ {
795
+ LargestInt int_;
796
+ LargestUInt uint_;
797
+ double real_;
798
+ bool bool_;
799
+ char *string_;
800
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
801
+ ValueInternalArray *array_;
802
+ ValueInternalMap *map_;
803
+ #else
804
+ ObjectValues *map_;
805
+ # endif
806
+ } value_;
807
+ ValueType type_ : 8;
808
+ int allocated_ : 1; // Notes: if declared as bool, bitfield is useless.
809
+ # ifdef JSON_VALUE_USE_INTERNAL_MAP
810
+ unsigned int itemIsUsed_ : 1; // used by the ValueInternalMap container.
811
+ int memberNameIsStatic_ : 1; // used by the ValueInternalMap container.
812
+ # endif
813
+ CommentInfo *comments_;
814
+ };
815
+
816
+
817
+ /** \brief Experimental and untested: represents an element of the "path" to access a node.
818
+ */
819
+ class PathArgument
820
+ {
821
+ public:
822
+ friend class Path;
823
+
824
+ PathArgument();
825
+ PathArgument( ArrayIndex index );
826
+ PathArgument( const char *key );
827
+ PathArgument( const std::string &key );
828
+
829
+ private:
830
+ enum Kind
831
+ {
832
+ kindNone = 0,
833
+ kindIndex,
834
+ kindKey
835
+ };
836
+ std::string key_;
837
+ ArrayIndex index_;
838
+ Kind kind_;
839
+ };
840
+
841
+ /** \brief Experimental and untested: represents a "path" to access a node.
842
+ *
843
+ * Syntax:
844
+ * - "." => root node
845
+ * - ".[n]" => elements at index 'n' of root node (an array value)
846
+ * - ".name" => member named 'name' of root node (an object value)
847
+ * - ".name1.name2.name3"
848
+ * - ".[0][1][2].name1[3]"
849
+ * - ".%" => member name is provided as parameter
850
+ * - ".[%]" => index is provied as parameter
851
+ */
852
+ class Path
853
+ {
854
+ public:
855
+ Path( const std::string &path,
856
+ const PathArgument &a1 = PathArgument(),
857
+ const PathArgument &a2 = PathArgument(),
858
+ const PathArgument &a3 = PathArgument(),
859
+ const PathArgument &a4 = PathArgument(),
860
+ const PathArgument &a5 = PathArgument() );
861
+
862
+ const Value &resolve( const Value &root ) const;
863
+ Value resolve( const Value &root,
864
+ const Value &defaultValue ) const;
865
+ /// Creates the "path" to access the specified node and returns a reference on the node.
866
+ Value &make( Value &root ) const;
867
+
868
+ private:
869
+ typedef std::vector<const PathArgument *> InArgs;
870
+ typedef std::vector<PathArgument> Args;
871
+
872
+ void makePath( const std::string &path,
873
+ const InArgs &in );
874
+ void addPathInArg( const std::string &path,
875
+ const InArgs &in,
876
+ InArgs::const_iterator &itInArg,
877
+ PathArgument::Kind kind );
878
+ void invalidPath( const std::string &path,
879
+ int location );
880
+
881
+ Args args_;
882
+ };
883
+
884
+
885
+
886
+ #ifdef JSON_VALUE_USE_INTERNAL_MAP
887
+ /** \brief Allocator to customize Value internal map.
888
+ * Below is an example of a simple implementation (default implementation actually
889
+ * use memory pool for speed).
890
+ * \code
891
+ class DefaultValueMapAllocator : public ValueMapAllocator
892
+ {
893
+ public: // overridden from ValueMapAllocator
894
+ virtual ValueInternalMap *newMap()
895
+ {
896
+ return new ValueInternalMap();
897
+ }
898
+
899
+ virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other )
900
+ {
901
+ return new ValueInternalMap( other );
902
+ }
903
+
904
+ virtual void destructMap( ValueInternalMap *map )
905
+ {
906
+ delete map;
907
+ }
908
+
909
+ virtual ValueInternalLink *allocateMapBuckets( unsigned int size )
910
+ {
911
+ return new ValueInternalLink[size];
912
+ }
913
+
914
+ virtual void releaseMapBuckets( ValueInternalLink *links )
915
+ {
916
+ delete [] links;
917
+ }
918
+
919
+ virtual ValueInternalLink *allocateMapLink()
920
+ {
921
+ return new ValueInternalLink();
922
+ }
923
+
924
+ virtual void releaseMapLink( ValueInternalLink *link )
925
+ {
926
+ delete link;
927
+ }
928
+ };
929
+ * \endcode
930
+ */
931
+ class JSON_API ValueMapAllocator
932
+ {
933
+ public:
934
+ virtual ~ValueMapAllocator();
935
+ virtual ValueInternalMap *newMap() = 0;
936
+ virtual ValueInternalMap *newMapCopy( const ValueInternalMap &other ) = 0;
937
+ virtual void destructMap( ValueInternalMap *map ) = 0;
938
+ virtual ValueInternalLink *allocateMapBuckets( unsigned int size ) = 0;
939
+ virtual void releaseMapBuckets( ValueInternalLink *links ) = 0;
940
+ virtual ValueInternalLink *allocateMapLink() = 0;
941
+ virtual void releaseMapLink( ValueInternalLink *link ) = 0;
942
+ };
943
+
944
+ /** \brief ValueInternalMap hash-map bucket chain link (for internal use only).
945
+ * \internal previous_ & next_ allows for bidirectional traversal.
946
+ */
947
+ class JSON_API ValueInternalLink
948
+ {
949
+ public:
950
+ enum { itemPerLink = 6 }; // sizeof(ValueInternalLink) = 128 on 32 bits architecture.
951
+ enum InternalFlags {
952
+ flagAvailable = 0,
953
+ flagUsed = 1
954
+ };
955
+
956
+ ValueInternalLink();
957
+
958
+ ~ValueInternalLink();
959
+
960
+ Value items_[itemPerLink];
961
+ char *keys_[itemPerLink];
962
+ ValueInternalLink *previous_;
963
+ ValueInternalLink *next_;
964
+ };
965
+
966
+
967
+ /** \brief A linked page based hash-table implementation used internally by Value.
968
+ * \internal ValueInternalMap is a tradional bucket based hash-table, with a linked
969
+ * list in each bucket to handle collision. There is an addional twist in that
970
+ * each node of the collision linked list is a page containing a fixed amount of
971
+ * value. This provides a better compromise between memory usage and speed.
972
+ *
973
+ * Each bucket is made up of a chained list of ValueInternalLink. The last
974
+ * link of a given bucket can be found in the 'previous_' field of the following bucket.
975
+ * The last link of the last bucket is stored in tailLink_ as it has no following bucket.
976
+ * Only the last link of a bucket may contains 'available' item. The last link always
977
+ * contains at least one element unless is it the bucket one very first link.
978
+ */
979
+ class JSON_API ValueInternalMap
980
+ {
981
+ friend class ValueIteratorBase;
982
+ friend class Value;
983
+ public:
984
+ typedef unsigned int HashKey;
985
+ typedef unsigned int BucketIndex;
986
+
987
+ # ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
988
+ struct IteratorState
989
+ {
990
+ IteratorState()
991
+ : map_(0)
992
+ , link_(0)
993
+ , itemIndex_(0)
994
+ , bucketIndex_(0)
995
+ {
996
+ }
997
+ ValueInternalMap *map_;
998
+ ValueInternalLink *link_;
999
+ BucketIndex itemIndex_;
1000
+ BucketIndex bucketIndex_;
1001
+ };
1002
+ # endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
1003
+
1004
+ ValueInternalMap();
1005
+ ValueInternalMap( const ValueInternalMap &other );
1006
+ ValueInternalMap &operator =( const ValueInternalMap &other );
1007
+ ~ValueInternalMap();
1008
+
1009
+ void swap( ValueInternalMap &other );
1010
+
1011
+ BucketIndex size() const;
1012
+
1013
+ void clear();
1014
+
1015
+ bool reserveDelta( BucketIndex growth );
1016
+
1017
+ bool reserve( BucketIndex newItemCount );
1018
+
1019
+ const Value *find( const char *key ) const;
1020
+
1021
+ Value *find( const char *key );
1022
+
1023
+ Value &resolveReference( const char *key,
1024
+ bool isStatic );
1025
+
1026
+ void remove( const char *key );
1027
+
1028
+ void doActualRemove( ValueInternalLink *link,
1029
+ BucketIndex index,
1030
+ BucketIndex bucketIndex );
1031
+
1032
+ ValueInternalLink *&getLastLinkInBucket( BucketIndex bucketIndex );
1033
+
1034
+ Value &setNewItem( const char *key,
1035
+ bool isStatic,
1036
+ ValueInternalLink *link,
1037
+ BucketIndex index );
1038
+
1039
+ Value &unsafeAdd( const char *key,
1040
+ bool isStatic,
1041
+ HashKey hashedKey );
1042
+
1043
+ HashKey hash( const char *key ) const;
1044
+
1045
+ int compare( const ValueInternalMap &other ) const;
1046
+
1047
+ private:
1048
+ void makeBeginIterator( IteratorState &it ) const;
1049
+ void makeEndIterator( IteratorState &it ) const;
1050
+ static bool equals( const IteratorState &x, const IteratorState &other );
1051
+ static void increment( IteratorState &iterator );
1052
+ static void incrementBucket( IteratorState &iterator );
1053
+ static void decrement( IteratorState &iterator );
1054
+ static const char *key( const IteratorState &iterator );
1055
+ static const char *key( const IteratorState &iterator, bool &isStatic );
1056
+ static Value &value( const IteratorState &iterator );
1057
+ static int distance( const IteratorState &x, const IteratorState &y );
1058
+
1059
+ private:
1060
+ ValueInternalLink *buckets_;
1061
+ ValueInternalLink *tailLink_;
1062
+ BucketIndex bucketsSize_;
1063
+ BucketIndex itemCount_;
1064
+ };
1065
+
1066
+ /** \brief A simplified deque implementation used internally by Value.
1067
+ * \internal
1068
+ * It is based on a list of fixed "page", each page contains a fixed number of items.
1069
+ * Instead of using a linked-list, a array of pointer is used for fast item look-up.
1070
+ * Look-up for an element is as follow:
1071
+ * - compute page index: pageIndex = itemIndex / itemsPerPage
1072
+ * - look-up item in page: pages_[pageIndex][itemIndex % itemsPerPage]
1073
+ *
1074
+ * Insertion is amortized constant time (only the array containing the index of pointers
1075
+ * need to be reallocated when items are appended).
1076
+ */
1077
+ class JSON_API ValueInternalArray
1078
+ {
1079
+ friend class Value;
1080
+ friend class ValueIteratorBase;
1081
+ public:
1082
+ enum { itemsPerPage = 8 }; // should be a power of 2 for fast divide and modulo.
1083
+ typedef Value::ArrayIndex ArrayIndex;
1084
+ typedef unsigned int PageIndex;
1085
+
1086
+ # ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
1087
+ struct IteratorState // Must be a POD
1088
+ {
1089
+ IteratorState()
1090
+ : array_(0)
1091
+ , currentPageIndex_(0)
1092
+ , currentItemIndex_(0)
1093
+ {
1094
+ }
1095
+ ValueInternalArray *array_;
1096
+ Value **currentPageIndex_;
1097
+ unsigned int currentItemIndex_;
1098
+ };
1099
+ # endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
1100
+
1101
+ ValueInternalArray();
1102
+ ValueInternalArray( const ValueInternalArray &other );
1103
+ ValueInternalArray &operator =( const ValueInternalArray &other );
1104
+ ~ValueInternalArray();
1105
+ void swap( ValueInternalArray &other );
1106
+
1107
+ void clear();
1108
+ void resize( ArrayIndex newSize );
1109
+
1110
+ Value &resolveReference( ArrayIndex index );
1111
+
1112
+ Value *find( ArrayIndex index ) const;
1113
+
1114
+ ArrayIndex size() const;
1115
+
1116
+ int compare( const ValueInternalArray &other ) const;
1117
+
1118
+ private:
1119
+ static bool equals( const IteratorState &x, const IteratorState &other );
1120
+ static void increment( IteratorState &iterator );
1121
+ static void decrement( IteratorState &iterator );
1122
+ static Value &dereference( const IteratorState &iterator );
1123
+ static Value &unsafeDereference( const IteratorState &iterator );
1124
+ static int distance( const IteratorState &x, const IteratorState &y );
1125
+ static ArrayIndex indexOf( const IteratorState &iterator );
1126
+ void makeBeginIterator( IteratorState &it ) const;
1127
+ void makeEndIterator( IteratorState &it ) const;
1128
+ void makeIterator( IteratorState &it, ArrayIndex index ) const;
1129
+
1130
+ void makeIndexValid( ArrayIndex index );
1131
+
1132
+ Value **pages_;
1133
+ ArrayIndex size_;
1134
+ PageIndex pageCount_;
1135
+ };
1136
+
1137
+ /** \brief Experimental: do not use. Allocator to customize Value internal array.
1138
+ * Below is an example of a simple implementation (actual implementation use
1139
+ * memory pool).
1140
+ \code
1141
+ class DefaultValueArrayAllocator : public ValueArrayAllocator
1142
+ {
1143
+ public: // overridden from ValueArrayAllocator
1144
+ virtual ~DefaultValueArrayAllocator()
1145
+ {
1146
+ }
1147
+
1148
+ virtual ValueInternalArray *newArray()
1149
+ {
1150
+ return new ValueInternalArray();
1151
+ }
1152
+
1153
+ virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other )
1154
+ {
1155
+ return new ValueInternalArray( other );
1156
+ }
1157
+
1158
+ virtual void destruct( ValueInternalArray *array )
1159
+ {
1160
+ delete array;
1161
+ }
1162
+
1163
+ virtual void reallocateArrayPageIndex( Value **&indexes,
1164
+ ValueInternalArray::PageIndex &indexCount,
1165
+ ValueInternalArray::PageIndex minNewIndexCount )
1166
+ {
1167
+ ValueInternalArray::PageIndex newIndexCount = (indexCount*3)/2 + 1;
1168
+ if ( minNewIndexCount > newIndexCount )
1169
+ newIndexCount = minNewIndexCount;
1170
+ void *newIndexes = realloc( indexes, sizeof(Value*) * newIndexCount );
1171
+ if ( !newIndexes )
1172
+ throw std::bad_alloc();
1173
+ indexCount = newIndexCount;
1174
+ indexes = static_cast<Value **>( newIndexes );
1175
+ }
1176
+ virtual void releaseArrayPageIndex( Value **indexes,
1177
+ ValueInternalArray::PageIndex indexCount )
1178
+ {
1179
+ if ( indexes )
1180
+ free( indexes );
1181
+ }
1182
+
1183
+ virtual Value *allocateArrayPage()
1184
+ {
1185
+ return static_cast<Value *>( malloc( sizeof(Value) * ValueInternalArray::itemsPerPage ) );
1186
+ }
1187
+
1188
+ virtual void releaseArrayPage( Value *value )
1189
+ {
1190
+ if ( value )
1191
+ free( value );
1192
+ }
1193
+ };
1194
+ \endcode
1195
+ */
1196
+ class JSON_API ValueArrayAllocator
1197
+ {
1198
+ public:
1199
+ virtual ~ValueArrayAllocator();
1200
+ virtual ValueInternalArray *newArray() = 0;
1201
+ virtual ValueInternalArray *newArrayCopy( const ValueInternalArray &other ) = 0;
1202
+ virtual void destructArray( ValueInternalArray *array ) = 0;
1203
+ /** \brief Reallocate array page index.
1204
+ * Reallocates an array of pointer on each page.
1205
+ * \param indexes [input] pointer on the current index. May be \c NULL.
1206
+ * [output] pointer on the new index of at least
1207
+ * \a minNewIndexCount pages.
1208
+ * \param indexCount [input] current number of pages in the index.
1209
+ * [output] number of page the reallocated index can handle.
1210
+ * \b MUST be >= \a minNewIndexCount.
1211
+ * \param minNewIndexCount Minimum number of page the new index must be able to
1212
+ * handle.
1213
+ */
1214
+ virtual void reallocateArrayPageIndex( Value **&indexes,
1215
+ ValueInternalArray::PageIndex &indexCount,
1216
+ ValueInternalArray::PageIndex minNewIndexCount ) = 0;
1217
+ virtual void releaseArrayPageIndex( Value **indexes,
1218
+ ValueInternalArray::PageIndex indexCount ) = 0;
1219
+ virtual Value *allocateArrayPage() = 0;
1220
+ virtual void releaseArrayPage( Value *value ) = 0;
1221
+ };
1222
+ #endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP
1223
+
1224
+
1225
+ /** \brief base class for Value iterators.
1226
+ *
1227
+ */
1228
+ class ValueIteratorBase
1229
+ {
1230
+ public:
1231
+ typedef unsigned int size_t;
1232
+ typedef int difference_type;
1233
+ typedef ValueIteratorBase SelfType;
1234
+
1235
+ ValueIteratorBase();
1236
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1237
+ explicit ValueIteratorBase( const Value::ObjectValues::iterator &current );
1238
+ #else
1239
+ ValueIteratorBase( const ValueInternalArray::IteratorState &state );
1240
+ ValueIteratorBase( const ValueInternalMap::IteratorState &state );
1241
+ #endif
1242
+
1243
+ bool operator ==( const SelfType &other ) const
1244
+ {
1245
+ return isEqual( other );
1246
+ }
1247
+
1248
+ bool operator !=( const SelfType &other ) const
1249
+ {
1250
+ return !isEqual( other );
1251
+ }
1252
+
1253
+ difference_type operator -( const SelfType &other ) const
1254
+ {
1255
+ return computeDistance( other );
1256
+ }
1257
+
1258
+ /// Return either the index or the member name of the referenced value as a Value.
1259
+ Value key() const;
1260
+
1261
+ /// Return the index of the referenced Value. -1 if it is not an arrayValue.
1262
+ UInt index() const;
1263
+
1264
+ /// Return the member name of the referenced Value. "" if it is not an objectValue.
1265
+ const char *memberName() const;
1266
+
1267
+ protected:
1268
+ Value &deref() const;
1269
+
1270
+ void increment();
1271
+
1272
+ void decrement();
1273
+
1274
+ difference_type computeDistance( const SelfType &other ) const;
1275
+
1276
+ bool isEqual( const SelfType &other ) const;
1277
+
1278
+ void copy( const SelfType &other );
1279
+
1280
+ private:
1281
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1282
+ Value::ObjectValues::iterator current_;
1283
+ // Indicates that iterator is for a null value.
1284
+ bool isNull_;
1285
+ #else
1286
+ union
1287
+ {
1288
+ ValueInternalArray::IteratorState array_;
1289
+ ValueInternalMap::IteratorState map_;
1290
+ } iterator_;
1291
+ bool isArray_;
1292
+ #endif
1293
+ };
1294
+
1295
+ /** \brief const iterator for object and array value.
1296
+ *
1297
+ */
1298
+ class ValueConstIterator : public ValueIteratorBase
1299
+ {
1300
+ friend class Value;
1301
+ public:
1302
+ typedef unsigned int size_t;
1303
+ typedef int difference_type;
1304
+ typedef const Value &reference;
1305
+ typedef const Value *pointer;
1306
+ typedef ValueConstIterator SelfType;
1307
+
1308
+ ValueConstIterator();
1309
+ private:
1310
+ /*! \internal Use by Value to create an iterator.
1311
+ */
1312
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1313
+ explicit ValueConstIterator( const Value::ObjectValues::iterator &current );
1314
+ #else
1315
+ ValueConstIterator( const ValueInternalArray::IteratorState &state );
1316
+ ValueConstIterator( const ValueInternalMap::IteratorState &state );
1317
+ #endif
1318
+ public:
1319
+ SelfType &operator =( const ValueIteratorBase &other );
1320
+
1321
+ SelfType operator++( int )
1322
+ {
1323
+ SelfType temp( *this );
1324
+ ++*this;
1325
+ return temp;
1326
+ }
1327
+
1328
+ SelfType operator--( int )
1329
+ {
1330
+ SelfType temp( *this );
1331
+ --*this;
1332
+ return temp;
1333
+ }
1334
+
1335
+ SelfType &operator--()
1336
+ {
1337
+ decrement();
1338
+ return *this;
1339
+ }
1340
+
1341
+ SelfType &operator++()
1342
+ {
1343
+ increment();
1344
+ return *this;
1345
+ }
1346
+
1347
+ reference operator *() const
1348
+ {
1349
+ return deref();
1350
+ }
1351
+ };
1352
+
1353
+
1354
+ /** \brief Iterator for object and array value.
1355
+ */
1356
+ class ValueIterator : public ValueIteratorBase
1357
+ {
1358
+ friend class Value;
1359
+ public:
1360
+ typedef unsigned int size_t;
1361
+ typedef int difference_type;
1362
+ typedef Value &reference;
1363
+ typedef Value *pointer;
1364
+ typedef ValueIterator SelfType;
1365
+
1366
+ ValueIterator();
1367
+ ValueIterator( const ValueConstIterator &other );
1368
+ ValueIterator( const ValueIterator &other );
1369
+ private:
1370
+ /*! \internal Use by Value to create an iterator.
1371
+ */
1372
+ #ifndef JSON_VALUE_USE_INTERNAL_MAP
1373
+ explicit ValueIterator( const Value::ObjectValues::iterator &current );
1374
+ #else
1375
+ ValueIterator( const ValueInternalArray::IteratorState &state );
1376
+ ValueIterator( const ValueInternalMap::IteratorState &state );
1377
+ #endif
1378
+ public:
1379
+
1380
+ SelfType &operator =( const SelfType &other );
1381
+
1382
+ SelfType operator++( int )
1383
+ {
1384
+ SelfType temp( *this );
1385
+ ++*this;
1386
+ return temp;
1387
+ }
1388
+
1389
+ SelfType operator--( int )
1390
+ {
1391
+ SelfType temp( *this );
1392
+ --*this;
1393
+ return temp;
1394
+ }
1395
+
1396
+ SelfType &operator--()
1397
+ {
1398
+ decrement();
1399
+ return *this;
1400
+ }
1401
+
1402
+ SelfType &operator++()
1403
+ {
1404
+ increment();
1405
+ return *this;
1406
+ }
1407
+
1408
+ reference operator *() const
1409
+ {
1410
+ return deref();
1411
+ }
1412
+ };
1413
+
1414
+
1415
+ } // namespace Json
1416
+
1417
+
1418
+ #endif // CPPTL_JSON_H_INCLUDED
1419
+
1420
+ // //////////////////////////////////////////////////////////////////////
1421
+ // End of content of file: include/json/value.h
1422
+ // //////////////////////////////////////////////////////////////////////
1423
+
1424
+
1425
+
1426
+
1427
+
1428
+
1429
+ // //////////////////////////////////////////////////////////////////////
1430
+ // Beginning of content of file: include/json/reader.h
1431
+ // //////////////////////////////////////////////////////////////////////
1432
+
1433
+ // Copyright 2007-2010 Baptiste Lepilleur
1434
+ // Distributed under MIT license, or public domain if desired and
1435
+ // recognized in your jurisdiction.
1436
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
1437
+
1438
+ #ifndef CPPTL_JSON_READER_H_INCLUDED
1439
+ # define CPPTL_JSON_READER_H_INCLUDED
1440
+
1441
+ #if !defined(JSON_IS_AMALGAMATION)
1442
+ # include "features.h"
1443
+ # include "value.h"
1444
+ #endif // if !defined(JSON_IS_AMALGAMATION)
1445
+ # include <deque>
1446
+ # include <stack>
1447
+ # include <string>
1448
+ # include <iostream>
1449
+
1450
+ namespace Json {
1451
+
1452
+ /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value.
1453
+ *
1454
+ */
1455
+ class JSON_API Reader
1456
+ {
1457
+ public:
1458
+ typedef char Char;
1459
+ typedef const Char *Location;
1460
+
1461
+ /** \brief Constructs a Reader allowing all features
1462
+ * for parsing.
1463
+ */
1464
+ Reader();
1465
+
1466
+ /** \brief Constructs a Reader allowing the specified feature set
1467
+ * for parsing.
1468
+ */
1469
+ Reader( const Features &features );
1470
+
1471
+ /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
1472
+ * \param document UTF-8 encoded string containing the document to read.
1473
+ * \param root [out] Contains the root value of the document if it was
1474
+ * successfully parsed.
1475
+ * \param collectComments \c true to collect comment and allow writing them back during
1476
+ * serialization, \c false to discard comments.
1477
+ * This parameter is ignored if Features::allowComments_
1478
+ * is \c false.
1479
+ * \return \c true if the document was successfully parsed, \c false if an error occurred.
1480
+ */
1481
+ bool parse( const std::string &document,
1482
+ Value &root,
1483
+ bool collectComments = true );
1484
+
1485
+ /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document.
1486
+ * \param beginDoc Pointer on the beginning of the UTF-8 encoded string of the document to read.
1487
+ * \param endDoc Pointer on the end of the UTF-8 encoded string of the document to read.
1488
+ \ Must be >= beginDoc.
1489
+ * \param root [out] Contains the root value of the document if it was
1490
+ * successfully parsed.
1491
+ * \param collectComments \c true to collect comment and allow writing them back during
1492
+ * serialization, \c false to discard comments.
1493
+ * This parameter is ignored if Features::allowComments_
1494
+ * is \c false.
1495
+ * \return \c true if the document was successfully parsed, \c false if an error occurred.
1496
+ */
1497
+ bool parse( const char *beginDoc, const char *endDoc,
1498
+ Value &root,
1499
+ bool collectComments = true );
1500
+
1501
+ /// \brief Parse from input stream.
1502
+ /// \see Json::operator>>(std::istream&, Json::Value&).
1503
+ bool parse( std::istream &is,
1504
+ Value &root,
1505
+ bool collectComments = true );
1506
+
1507
+ /** \brief Returns a user friendly string that list errors in the parsed document.
1508
+ * \return Formatted error message with the list of errors with their location in
1509
+ * the parsed document. An empty string is returned if no error occurred
1510
+ * during parsing.
1511
+ * \deprecated Use getFormattedErrorMessages() instead (typo fix).
1512
+ */
1513
+ JSONCPP_DEPRECATED("Use getFormattedErrorMessages instead")
1514
+ std::string getFormatedErrorMessages() const;
1515
+
1516
+ /** \brief Returns a user friendly string that list errors in the parsed document.
1517
+ * \return Formatted error message with the list of errors with their location in
1518
+ * the parsed document. An empty string is returned if no error occurred
1519
+ * during parsing.
1520
+ */
1521
+ std::string getFormattedErrorMessages() const;
1522
+
1523
+ private:
1524
+ enum TokenType
1525
+ {
1526
+ tokenEndOfStream = 0,
1527
+ tokenObjectBegin,
1528
+ tokenObjectEnd,
1529
+ tokenArrayBegin,
1530
+ tokenArrayEnd,
1531
+ tokenString,
1532
+ tokenNumber,
1533
+ tokenTrue,
1534
+ tokenFalse,
1535
+ tokenNull,
1536
+ tokenArraySeparator,
1537
+ tokenMemberSeparator,
1538
+ tokenComment,
1539
+ tokenError
1540
+ };
1541
+
1542
+ class Token
1543
+ {
1544
+ public:
1545
+ TokenType type_;
1546
+ Location start_;
1547
+ Location end_;
1548
+ };
1549
+
1550
+ class ErrorInfo
1551
+ {
1552
+ public:
1553
+ Token token_;
1554
+ std::string message_;
1555
+ Location extra_;
1556
+ };
1557
+
1558
+ typedef std::deque<ErrorInfo> Errors;
1559
+
1560
+ bool expectToken( TokenType type, Token &token, const char *message );
1561
+ bool readToken( Token &token );
1562
+ void skipSpaces();
1563
+ bool match( Location pattern,
1564
+ int patternLength );
1565
+ bool readComment();
1566
+ bool readCStyleComment();
1567
+ bool readCppStyleComment();
1568
+ bool readString();
1569
+ void readNumber();
1570
+ bool readValue();
1571
+ bool readObject( Token &token );
1572
+ bool readArray( Token &token );
1573
+ bool decodeNumber( Token &token );
1574
+ bool decodeString( Token &token );
1575
+ bool decodeString( Token &token, std::string &decoded );
1576
+ bool decodeDouble( Token &token );
1577
+ bool decodeUnicodeCodePoint( Token &token,
1578
+ Location &current,
1579
+ Location end,
1580
+ unsigned int &unicode );
1581
+ bool decodeUnicodeEscapeSequence( Token &token,
1582
+ Location &current,
1583
+ Location end,
1584
+ unsigned int &unicode );
1585
+ bool addError( const std::string &message,
1586
+ Token &token,
1587
+ Location extra = 0 );
1588
+ bool recoverFromError( TokenType skipUntilToken );
1589
+ bool addErrorAndRecover( const std::string &message,
1590
+ Token &token,
1591
+ TokenType skipUntilToken );
1592
+ void skipUntilSpace();
1593
+ Value &currentValue();
1594
+ Char getNextChar();
1595
+ void getLocationLineAndColumn( Location location,
1596
+ int &line,
1597
+ int &column ) const;
1598
+ std::string getLocationLineAndColumn( Location location ) const;
1599
+ void addComment( Location begin,
1600
+ Location end,
1601
+ CommentPlacement placement );
1602
+ void skipCommentTokens( Token &token );
1603
+
1604
+ typedef std::stack<Value *> Nodes;
1605
+ Nodes nodes_;
1606
+ Errors errors_;
1607
+ std::string document_;
1608
+ Location begin_;
1609
+ Location end_;
1610
+ Location current_;
1611
+ Location lastValueEnd_;
1612
+ Value *lastValue_;
1613
+ std::string commentsBefore_;
1614
+ Features features_;
1615
+ bool collectComments_;
1616
+ };
1617
+
1618
+ /** \brief Read from 'sin' into 'root'.
1619
+
1620
+ Always keep comments from the input JSON.
1621
+
1622
+ This can be used to read a file into a particular sub-object.
1623
+ For example:
1624
+ \code
1625
+ Json::Value root;
1626
+ cin >> root["dir"]["file"];
1627
+ cout << root;
1628
+ \endcode
1629
+ Result:
1630
+ \verbatim
1631
+ {
1632
+ "dir": {
1633
+ "file": {
1634
+ // The input stream JSON would be nested here.
1635
+ }
1636
+ }
1637
+ }
1638
+ \endverbatim
1639
+ \throw std::exception on parse error.
1640
+ \see Json::operator<<()
1641
+ */
1642
+ std::istream& operator>>( std::istream&, Value& );
1643
+
1644
+ } // namespace Json
1645
+
1646
+ #endif // CPPTL_JSON_READER_H_INCLUDED
1647
+
1648
+ // //////////////////////////////////////////////////////////////////////
1649
+ // End of content of file: include/json/reader.h
1650
+ // //////////////////////////////////////////////////////////////////////
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+ // //////////////////////////////////////////////////////////////////////
1658
+ // Beginning of content of file: include/json/writer.h
1659
+ // //////////////////////////////////////////////////////////////////////
1660
+
1661
+ // Copyright 2007-2010 Baptiste Lepilleur
1662
+ // Distributed under MIT license, or public domain if desired and
1663
+ // recognized in your jurisdiction.
1664
+ // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
1665
+
1666
+ #ifndef JSON_WRITER_H_INCLUDED
1667
+ # define JSON_WRITER_H_INCLUDED
1668
+
1669
+ #if !defined(JSON_IS_AMALGAMATION)
1670
+ # include "value.h"
1671
+ #endif // if !defined(JSON_IS_AMALGAMATION)
1672
+ # include <vector>
1673
+ # include <string>
1674
+ # include <iostream>
1675
+
1676
+ namespace Json {
1677
+
1678
+ class Value;
1679
+
1680
+ /** \brief Abstract class for writers.
1681
+ */
1682
+ class JSON_API Writer
1683
+ {
1684
+ public:
1685
+ virtual ~Writer();
1686
+
1687
+ virtual std::string write( const Value &root ) = 0;
1688
+ };
1689
+
1690
+ /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly).
1691
+ *
1692
+ * The JSON document is written in a single line. It is not intended for 'human' consumption,
1693
+ * but may be usefull to support feature such as RPC where bandwith is limited.
1694
+ * \sa Reader, Value
1695
+ */
1696
+ class JSON_API FastWriter : public Writer
1697
+ {
1698
+ public:
1699
+ FastWriter();
1700
+ virtual ~FastWriter(){}
1701
+
1702
+ void enableYAMLCompatibility();
1703
+
1704
+ public: // overridden from Writer
1705
+ virtual std::string write( const Value &root );
1706
+
1707
+ private:
1708
+ void writeValue( const Value &value );
1709
+
1710
+ std::string document_;
1711
+ bool yamlCompatiblityEnabled_;
1712
+ };
1713
+
1714
+ /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way.
1715
+ *
1716
+ * The rules for line break and indent are as follow:
1717
+ * - Object value:
1718
+ * - if empty then print {} without indent and line break
1719
+ * - if not empty the print '{', line break & indent, print one value per line
1720
+ * and then unindent and line break and print '}'.
1721
+ * - Array value:
1722
+ * - if empty then print [] without indent and line break
1723
+ * - if the array contains no object value, empty array or some other value types,
1724
+ * and all the values fit on one lines, then print the array on a single line.
1725
+ * - otherwise, it the values do not fit on one line, or the array contains
1726
+ * object or non empty array, then print one value per line.
1727
+ *
1728
+ * If the Value have comments then they are outputed according to their #CommentPlacement.
1729
+ *
1730
+ * \sa Reader, Value, Value::setComment()
1731
+ */
1732
+ class JSON_API StyledWriter: public Writer
1733
+ {
1734
+ public:
1735
+ StyledWriter();
1736
+ virtual ~StyledWriter(){}
1737
+
1738
+ public: // overridden from Writer
1739
+ /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
1740
+ * \param root Value to serialize.
1741
+ * \return String containing the JSON document that represents the root value.
1742
+ */
1743
+ virtual std::string write( const Value &root );
1744
+
1745
+ private:
1746
+ void writeValue( const Value &value );
1747
+ void writeArrayValue( const Value &value );
1748
+ bool isMultineArray( const Value &value );
1749
+ void pushValue( const std::string &value );
1750
+ void writeIndent();
1751
+ void writeWithIndent( const std::string &value );
1752
+ void indent();
1753
+ void unindent();
1754
+ void writeCommentBeforeValue( const Value &root );
1755
+ void writeCommentAfterValueOnSameLine( const Value &root );
1756
+ bool hasCommentForValue( const Value &value );
1757
+ static std::string normalizeEOL( const std::string &text );
1758
+
1759
+ typedef std::vector<std::string> ChildValues;
1760
+
1761
+ ChildValues childValues_;
1762
+ std::string document_;
1763
+ std::string indentString_;
1764
+ int rightMargin_;
1765
+ int indentSize_;
1766
+ bool addChildValues_;
1767
+ };
1768
+
1769
+ /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way,
1770
+ to a stream rather than to a string.
1771
+ *
1772
+ * The rules for line break and indent are as follow:
1773
+ * - Object value:
1774
+ * - if empty then print {} without indent and line break
1775
+ * - if not empty the print '{', line break & indent, print one value per line
1776
+ * and then unindent and line break and print '}'.
1777
+ * - Array value:
1778
+ * - if empty then print [] without indent and line break
1779
+ * - if the array contains no object value, empty array or some other value types,
1780
+ * and all the values fit on one lines, then print the array on a single line.
1781
+ * - otherwise, it the values do not fit on one line, or the array contains
1782
+ * object or non empty array, then print one value per line.
1783
+ *
1784
+ * If the Value have comments then they are outputed according to their #CommentPlacement.
1785
+ *
1786
+ * \param indentation Each level will be indented by this amount extra.
1787
+ * \sa Reader, Value, Value::setComment()
1788
+ */
1789
+ class JSON_API StyledStreamWriter
1790
+ {
1791
+ public:
1792
+ StyledStreamWriter( std::string indentation="\t" );
1793
+ ~StyledStreamWriter(){}
1794
+
1795
+ public:
1796
+ /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format.
1797
+ * \param out Stream to write to. (Can be ostringstream, e.g.)
1798
+ * \param root Value to serialize.
1799
+ * \note There is no point in deriving from Writer, since write() should not return a value.
1800
+ */
1801
+ void write( std::ostream &out, const Value &root );
1802
+
1803
+ private:
1804
+ void writeValue( const Value &value );
1805
+ void writeArrayValue( const Value &value );
1806
+ bool isMultineArray( const Value &value );
1807
+ void pushValue( const std::string &value );
1808
+ void writeIndent();
1809
+ void writeWithIndent( const std::string &value );
1810
+ void indent();
1811
+ void unindent();
1812
+ void writeCommentBeforeValue( const Value &root );
1813
+ void writeCommentAfterValueOnSameLine( const Value &root );
1814
+ bool hasCommentForValue( const Value &value );
1815
+ static std::string normalizeEOL( const std::string &text );
1816
+
1817
+ typedef std::vector<std::string> ChildValues;
1818
+
1819
+ ChildValues childValues_;
1820
+ std::ostream* document_;
1821
+ std::string indentString_;
1822
+ int rightMargin_;
1823
+ std::string indentation_;
1824
+ bool addChildValues_;
1825
+ };
1826
+
1827
+ # if defined(JSON_HAS_INT64)
1828
+ std::string JSON_API valueToString( Int value );
1829
+ std::string JSON_API valueToString( UInt value );
1830
+ # endif // if defined(JSON_HAS_INT64)
1831
+ std::string JSON_API valueToString( LargestInt value );
1832
+ std::string JSON_API valueToString( LargestUInt value );
1833
+ std::string JSON_API valueToString( double value );
1834
+ std::string JSON_API valueToString( bool value );
1835
+ std::string JSON_API valueToQuotedString( const char *value );
1836
+
1837
+ /// \brief Output using the StyledStreamWriter.
1838
+ /// \see Json::operator>>()
1839
+ std::ostream& operator<<( std::ostream&, const Value &root );
1840
+
1841
+ } // namespace Json
1842
+
1843
+
1844
+
1845
+ #endif // JSON_WRITER_H_INCLUDED
1846
+
1847
+ // //////////////////////////////////////////////////////////////////////
1848
+ // End of content of file: include/json/writer.h
1849
+ // //////////////////////////////////////////////////////////////////////
1850
+
1851
+
1852
+
1853
+
1854
+
1855
+ #endif //ifndef JSON_AMALGATED_H_INCLUDED