passenger 4.0.60 → 5.0.0.beta1

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 (1301) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +5 -0
  5. data/.travis.yml +3 -2
  6. data/CHANGELOG +31 -53
  7. data/CONTRIBUTING.md +4 -4
  8. data/CONTRIBUTORS +0 -1
  9. data/Gemfile +18 -0
  10. data/Gemfile.lock +41 -0
  11. data/Rakefile +16 -0
  12. data/bin/passenger +2 -2
  13. data/bin/passenger-install-apache2-module +12 -12
  14. data/bin/passenger-install-nginx-module +9 -14
  15. data/bin/passenger-status +125 -87
  16. data/build/agents.rb +112 -140
  17. data/build/apache2.rb +4 -9
  18. data/build/basics.rb +5 -3
  19. data/build/common_library.rb +1 -0
  20. data/build/cxx_tests.rb +69 -47
  21. data/build/debian.rb +4 -2
  22. data/build/documentation.rb +1 -0
  23. data/build/integration_tests.rb +28 -43
  24. data/build/misc.rb +0 -18
  25. data/build/nginx.rb +2 -6
  26. data/build/packaging.rb +33 -22
  27. data/build/preprocessor.rb +2 -4
  28. data/build/ruby_tests.rb +7 -26
  29. data/build/test_basics.rb +24 -25
  30. data/debian.template/control.template +2 -2
  31. data/debian.template/locations.ini.template +2 -3
  32. data/debian.template/passenger.install.template +2 -2
  33. data/debian.template/rules.template +1 -1
  34. data/dev/ci/run_jenkins.sh +0 -1
  35. data/dev/ci/run_rpm_tests.sh +3 -0
  36. data/dev/ci/run_travis.sh +63 -17
  37. data/dev/copy_boost_headers +22 -6
  38. data/dev/ruby_server.rb +244 -0
  39. data/dev/vagrant/provision.sh +3 -1
  40. data/doc/DebuggingAndStressTesting.md +3 -3
  41. data/doc/Design and Architecture.txt +5 -6
  42. data/doc/Packaging.txt.md +35 -6
  43. data/doc/ServerOptimizationGuide.txt.md +339 -0
  44. data/doc/Users guide Apache.idmap.txt +177 -187
  45. data/doc/Users guide Apache.txt +143 -219
  46. data/doc/Users guide Nginx.idmap.txt +166 -166
  47. data/doc/Users guide Nginx.txt +265 -223
  48. data/doc/Users guide Standalone.txt +3 -3
  49. data/doc/templates/markdown.html.erb +37 -6
  50. data/doc/users_guide_snippets/environment_variables.txt +1 -1
  51. data/doc/users_guide_snippets/support_information.txt +1 -1
  52. data/doc/users_guide_snippets/tips.txt +2 -2
  53. data/ext/apache2/Configuration.cpp +23 -81
  54. data/ext/apache2/Configuration.hpp +18 -92
  55. data/ext/apache2/ConfigurationCommands.cpp +64 -15
  56. data/ext/apache2/ConfigurationCommands.cpp.erb +8 -4
  57. data/ext/apache2/ConfigurationFields.hpp +12 -0
  58. data/ext/apache2/ConfigurationSetters.cpp +73 -1
  59. data/ext/apache2/ConfigurationSetters.cpp.erb +3 -2
  60. data/ext/apache2/CreateDirConfig.cpp +6 -0
  61. data/ext/apache2/DirectoryMapper.h +11 -6
  62. data/ext/apache2/Hooks.cpp +291 -408
  63. data/ext/apache2/MergeDirConfig.cpp +42 -0
  64. data/ext/apache2/SetHeaders.cpp +61 -16
  65. data/ext/apache2/SetHeaders.cpp.erb +9 -7
  66. data/ext/boost/container/allocator_traits.hpp +400 -0
  67. data/ext/boost/container/deque.hpp +2012 -0
  68. data/ext/boost/container/detail/adaptive_node_pool_impl.hpp +874 -0
  69. data/ext/boost/container/detail/advanced_insert_int.hpp +369 -0
  70. data/ext/boost/container/detail/algorithms.hpp +84 -0
  71. data/ext/boost/container/detail/allocation_type.hpp +54 -0
  72. data/ext/boost/container/detail/allocator_version_traits.hpp +163 -0
  73. data/ext/boost/container/detail/config_begin.hpp +49 -0
  74. data/ext/boost/container/detail/config_end.hpp +17 -0
  75. data/ext/boost/container/detail/destroyers.hpp +365 -0
  76. data/ext/boost/container/detail/flat_tree.hpp +1055 -0
  77. data/ext/boost/container/detail/function_detector.hpp +88 -0
  78. data/ext/boost/container/detail/iterators.hpp +611 -0
  79. data/ext/boost/container/detail/math_functions.hpp +113 -0
  80. data/ext/boost/container/detail/memory_util.hpp +83 -0
  81. data/ext/boost/container/detail/mpl.hpp +160 -0
  82. data/ext/boost/container/detail/multiallocation_chain.hpp +286 -0
  83. data/ext/boost/container/detail/node_alloc_holder.hpp +386 -0
  84. data/ext/boost/container/detail/node_pool_impl.hpp +365 -0
  85. data/ext/boost/container/detail/pair.hpp +354 -0
  86. data/ext/boost/container/detail/pool_common.hpp +52 -0
  87. data/ext/boost/container/detail/preprocessor.hpp +232 -0
  88. data/ext/boost/container/detail/transform_iterator.hpp +176 -0
  89. data/ext/boost/container/detail/tree.hpp +1134 -0
  90. data/ext/boost/container/detail/type_traits.hpp +210 -0
  91. data/ext/boost/container/detail/utilities.hpp +1141 -0
  92. data/ext/boost/container/detail/value_init.hpp +45 -0
  93. data/ext/boost/container/detail/variadic_templates_tools.hpp +153 -0
  94. data/ext/boost/container/detail/version_type.hpp +92 -0
  95. data/ext/boost/container/detail/workaround.hpp +44 -0
  96. data/ext/boost/container/flat_map.hpp +1674 -0
  97. data/ext/boost/container/flat_set.hpp +1408 -0
  98. data/ext/boost/container/list.hpp +1475 -0
  99. data/ext/boost/container/map.hpp +1508 -0
  100. data/ext/boost/container/scoped_allocator.hpp +1503 -0
  101. data/ext/boost/container/scoped_allocator_fwd.hpp +83 -0
  102. data/ext/boost/container/set.hpp +1280 -0
  103. data/ext/boost/container/slist.hpp +1706 -0
  104. data/ext/boost/container/stable_vector.hpp +1869 -0
  105. data/ext/boost/container/static_vector.hpp +1053 -0
  106. data/ext/boost/container/string.hpp +2856 -0
  107. data/ext/boost/container/throw_exception.hpp +110 -0
  108. data/ext/boost/container/vector.hpp +2671 -0
  109. data/ext/boost/detail/is_xxx.hpp +61 -0
  110. data/ext/boost/intrusive/any_hook.hpp +344 -0
  111. data/ext/boost/intrusive/avl_set.hpp +2528 -0
  112. data/ext/boost/intrusive/avl_set_hook.hpp +297 -0
  113. data/ext/boost/intrusive/avltree.hpp +1786 -0
  114. data/ext/boost/intrusive/avltree_algorithms.hpp +968 -0
  115. data/ext/boost/intrusive/bs_set_hook.hpp +296 -0
  116. data/ext/boost/intrusive/circular_list_algorithms.hpp +413 -0
  117. data/ext/boost/intrusive/circular_slist_algorithms.hpp +404 -0
  118. data/ext/boost/intrusive/derivation_value_traits.hpp +70 -0
  119. data/ext/boost/intrusive/detail/any_node_and_algorithms.hpp +297 -0
  120. data/ext/boost/intrusive/detail/assert.hpp +41 -0
  121. data/ext/boost/intrusive/detail/avltree_node.hpp +197 -0
  122. data/ext/boost/intrusive/detail/clear_on_destructor_base.hpp +36 -0
  123. data/ext/boost/intrusive/detail/common_slist_algorithms.hpp +102 -0
  124. data/ext/boost/intrusive/detail/config_begin.hpp +52 -0
  125. data/ext/boost/intrusive/detail/config_end.hpp +15 -0
  126. data/ext/boost/intrusive/detail/ebo_functor_holder.hpp +95 -0
  127. data/ext/boost/intrusive/detail/function_detector.hpp +88 -0
  128. data/ext/boost/intrusive/detail/generic_hook.hpp +209 -0
  129. data/ext/boost/intrusive/detail/has_member_function_callable_with.hpp +357 -0
  130. data/ext/boost/intrusive/detail/hashtable_node.hpp +249 -0
  131. data/ext/boost/intrusive/detail/is_stateful_value_traits.hpp +77 -0
  132. data/ext/boost/intrusive/detail/list_node.hpp +196 -0
  133. data/ext/boost/intrusive/detail/memory_util.hpp +288 -0
  134. data/ext/boost/intrusive/detail/mpl.hpp +383 -0
  135. data/ext/boost/intrusive/detail/parent_from_member.hpp +97 -0
  136. data/ext/boost/intrusive/detail/preprocessor.hpp +52 -0
  137. data/ext/boost/intrusive/detail/rbtree_node.hpp +201 -0
  138. data/ext/boost/intrusive/detail/slist_node.hpp +166 -0
  139. data/ext/boost/intrusive/detail/transform_iterator.hpp +173 -0
  140. data/ext/boost/intrusive/detail/tree_algorithms.hpp +1742 -0
  141. data/ext/boost/intrusive/detail/tree_node.hpp +199 -0
  142. data/ext/boost/intrusive/detail/utilities.hpp +858 -0
  143. data/ext/boost/intrusive/detail/workaround.hpp +22 -0
  144. data/ext/boost/intrusive/hashtable.hpp +3110 -0
  145. data/ext/boost/intrusive/intrusive_fwd.hpp +542 -0
  146. data/ext/boost/intrusive/linear_slist_algorithms.hpp +327 -0
  147. data/ext/boost/intrusive/link_mode.hpp +46 -0
  148. data/ext/boost/intrusive/list.hpp +1525 -0
  149. data/ext/boost/intrusive/list_hook.hpp +290 -0
  150. data/ext/boost/intrusive/member_value_traits.hpp +70 -0
  151. data/ext/boost/intrusive/options.hpp +810 -0
  152. data/ext/boost/intrusive/parent_from_member.hpp +42 -0
  153. data/ext/boost/intrusive/pointer_plus_bits.hpp +86 -0
  154. data/ext/boost/intrusive/pointer_traits.hpp +265 -0
  155. data/ext/boost/intrusive/priority_compare.hpp +39 -0
  156. data/ext/boost/intrusive/rbtree.hpp +1785 -0
  157. data/ext/boost/intrusive/rbtree_algorithms.hpp +934 -0
  158. data/ext/boost/intrusive/set.hpp +2554 -0
  159. data/ext/boost/intrusive/set_hook.hpp +300 -0
  160. data/ext/boost/intrusive/sg_set.hpp +2601 -0
  161. data/ext/boost/intrusive/sgtree.hpp +2009 -0
  162. data/ext/boost/intrusive/sgtree_algorithms.hpp +807 -0
  163. data/ext/boost/intrusive/slist.hpp +2219 -0
  164. data/ext/boost/intrusive/slist_hook.hpp +294 -0
  165. data/ext/boost/intrusive/splay_set.hpp +2575 -0
  166. data/ext/boost/intrusive/splay_set_hook.hpp +292 -0
  167. data/ext/boost/intrusive/splaytree.hpp +1784 -0
  168. data/ext/boost/intrusive/splaytree_algorithms.hpp +1008 -0
  169. data/ext/boost/intrusive/treap.hpp +1882 -0
  170. data/ext/boost/intrusive/treap_algorithms.hpp +919 -0
  171. data/ext/boost/intrusive/treap_set.hpp +2751 -0
  172. data/ext/boost/intrusive/trivial_value_traits.hpp +46 -0
  173. data/ext/boost/intrusive/unordered_set.hpp +2115 -0
  174. data/ext/boost/intrusive/unordered_set_hook.hpp +434 -0
  175. data/ext/boost/intrusive_ptr.hpp +18 -0
  176. data/ext/boost/math/common_factor_ct.hpp +180 -0
  177. data/ext/boost/math_fwd.hpp +108 -0
  178. data/ext/boost/move/detail/move_helpers.hpp +175 -0
  179. data/ext/boost/parameter.hpp +21 -0
  180. data/ext/boost/parameter/aux_/arg_list.hpp +459 -0
  181. data/ext/boost/parameter/aux_/cast.hpp +143 -0
  182. data/ext/boost/parameter/aux_/default.hpp +69 -0
  183. data/ext/boost/parameter/aux_/is_maybe.hpp +26 -0
  184. data/ext/boost/parameter/aux_/maybe.hpp +120 -0
  185. data/ext/boost/parameter/aux_/overloads.hpp +88 -0
  186. data/ext/boost/parameter/aux_/parameter_requirements.hpp +25 -0
  187. data/ext/boost/parameter/aux_/parenthesized_type.hpp +119 -0
  188. data/ext/boost/parameter/aux_/preprocessor/flatten.hpp +115 -0
  189. data/ext/boost/parameter/aux_/preprocessor/for_each.hpp +103 -0
  190. data/ext/boost/parameter/aux_/python/invoker.hpp +132 -0
  191. data/ext/boost/parameter/aux_/python/invoker_iterate.hpp +93 -0
  192. data/ext/boost/parameter/aux_/result_of0.hpp +36 -0
  193. data/ext/boost/parameter/aux_/set.hpp +67 -0
  194. data/ext/boost/parameter/aux_/tag.hpp +38 -0
  195. data/ext/boost/parameter/aux_/tagged_argument.hpp +188 -0
  196. data/ext/boost/parameter/aux_/template_keyword.hpp +47 -0
  197. data/ext/boost/parameter/aux_/unwrap_cv_reference.hpp +97 -0
  198. data/ext/boost/parameter/aux_/void.hpp +29 -0
  199. data/ext/boost/parameter/aux_/yesno.hpp +26 -0
  200. data/ext/boost/parameter/binding.hpp +106 -0
  201. data/ext/boost/parameter/config.hpp +14 -0
  202. data/ext/boost/parameter/keyword.hpp +152 -0
  203. data/ext/boost/parameter/macros.hpp +99 -0
  204. data/ext/boost/parameter/match.hpp +55 -0
  205. data/ext/boost/parameter/name.hpp +156 -0
  206. data/ext/boost/parameter/parameters.hpp +931 -0
  207. data/ext/boost/parameter/preprocessor.hpp +1178 -0
  208. data/ext/boost/parameter/python.hpp +735 -0
  209. data/ext/boost/parameter/value_type.hpp +108 -0
  210. data/ext/boost/pool/detail/for.m4 +107 -0
  211. data/ext/boost/pool/detail/guard.hpp +69 -0
  212. data/ext/boost/pool/detail/mutex.hpp +42 -0
  213. data/ext/boost/pool/detail/pool_construct.bat +24 -0
  214. data/ext/boost/pool/detail/pool_construct.ipp +852 -0
  215. data/ext/boost/pool/detail/pool_construct.m4 +84 -0
  216. data/ext/boost/pool/detail/pool_construct.sh +12 -0
  217. data/ext/boost/pool/detail/pool_construct_simple.bat +25 -0
  218. data/ext/boost/pool/detail/pool_construct_simple.ipp +43 -0
  219. data/ext/boost/pool/detail/pool_construct_simple.m4 +72 -0
  220. data/ext/boost/pool/detail/pool_construct_simple.sh +12 -0
  221. data/ext/boost/pool/object_pool.hpp +287 -0
  222. data/ext/boost/pool/pool.hpp +1024 -0
  223. data/ext/boost/pool/pool_alloc.hpp +488 -0
  224. data/ext/boost/pool/poolfwd.hpp +82 -0
  225. data/ext/boost/pool/simple_segregated_storage.hpp +377 -0
  226. data/ext/boost/pool/singleton_pool.hpp +251 -0
  227. data/ext/boost/preprocessor/arithmetic.hpp +25 -0
  228. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  229. data/ext/boost/preprocessor/arithmetic/div.hpp +39 -0
  230. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  231. data/ext/boost/preprocessor/arithmetic/mul.hpp +53 -0
  232. data/ext/boost/preprocessor/array.hpp +32 -0
  233. data/ext/boost/preprocessor/array/enum.hpp +33 -0
  234. data/ext/boost/preprocessor/array/insert.hpp +55 -0
  235. data/ext/boost/preprocessor/array/pop_back.hpp +37 -0
  236. data/ext/boost/preprocessor/array/pop_front.hpp +38 -0
  237. data/ext/boost/preprocessor/array/push_back.hpp +33 -0
  238. data/ext/boost/preprocessor/array/push_front.hpp +33 -0
  239. data/ext/boost/preprocessor/array/remove.hpp +54 -0
  240. data/ext/boost/preprocessor/array/replace.hpp +49 -0
  241. data/ext/boost/preprocessor/array/reverse.hpp +29 -0
  242. data/ext/boost/preprocessor/array/to_list.hpp +33 -0
  243. data/ext/boost/preprocessor/array/to_seq.hpp +33 -0
  244. data/ext/boost/preprocessor/array/to_tuple.hpp +22 -0
  245. data/ext/boost/preprocessor/assert_msg.hpp +17 -0
  246. data/ext/boost/preprocessor/comma.hpp +17 -0
  247. data/ext/boost/preprocessor/comparison.hpp +24 -0
  248. data/ext/boost/preprocessor/comparison/equal.hpp +34 -0
  249. data/ext/boost/preprocessor/comparison/greater.hpp +38 -0
  250. data/ext/boost/preprocessor/comparison/greater_equal.hpp +38 -0
  251. data/ext/boost/preprocessor/comparison/less.hpp +46 -0
  252. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  253. data/ext/boost/preprocessor/comparison/not_equal.hpp +814 -0
  254. data/ext/boost/preprocessor/config/limits.hpp +30 -0
  255. data/ext/boost/preprocessor/control.hpp +22 -0
  256. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  257. data/ext/boost/preprocessor/control/detail/dmc/while.hpp +536 -0
  258. data/ext/boost/preprocessor/control/detail/edg/while.hpp +534 -0
  259. data/ext/boost/preprocessor/control/detail/msvc/while.hpp +277 -0
  260. data/ext/boost/preprocessor/control/expr_if.hpp +30 -0
  261. data/ext/boost/preprocessor/debug.hpp +18 -0
  262. data/ext/boost/preprocessor/debug/assert.hpp +44 -0
  263. data/ext/boost/preprocessor/debug/line.hpp +35 -0
  264. data/ext/boost/preprocessor/detail/dmc/auto_rec.hpp +286 -0
  265. data/ext/boost/preprocessor/detail/is_nullary.hpp +30 -0
  266. data/ext/boost/preprocessor/detail/is_unary.hpp +30 -0
  267. data/ext/boost/preprocessor/detail/null.hpp +17 -0
  268. data/ext/boost/preprocessor/detail/split.hpp +35 -0
  269. data/ext/boost/preprocessor/enum_params_with_defaults.hpp +17 -0
  270. data/ext/boost/preprocessor/enum_shifted.hpp +17 -0
  271. data/ext/boost/preprocessor/expand.hpp +17 -0
  272. data/ext/boost/preprocessor/expr_if.hpp +17 -0
  273. data/ext/boost/preprocessor/facilities.hpp +23 -0
  274. data/ext/boost/preprocessor/facilities/apply.hpp +34 -0
  275. data/ext/boost/preprocessor/facilities/expand.hpp +28 -0
  276. data/ext/boost/preprocessor/facilities/is_1.hpp +23 -0
  277. data/ext/boost/preprocessor/facilities/is_empty.hpp +43 -0
  278. data/ext/boost/preprocessor/facilities/is_empty_or_1.hpp +30 -0
  279. data/ext/boost/preprocessor/for.hpp +17 -0
  280. data/ext/boost/preprocessor/if.hpp +17 -0
  281. data/ext/boost/preprocessor/iteration.hpp +19 -0
  282. data/ext/boost/preprocessor/iteration/detail/bounds/lower3.hpp +99 -0
  283. data/ext/boost/preprocessor/iteration/detail/bounds/lower4.hpp +99 -0
  284. data/ext/boost/preprocessor/iteration/detail/bounds/lower5.hpp +99 -0
  285. data/ext/boost/preprocessor/iteration/detail/bounds/upper3.hpp +99 -0
  286. data/ext/boost/preprocessor/iteration/detail/bounds/upper4.hpp +99 -0
  287. data/ext/boost/preprocessor/iteration/detail/bounds/upper5.hpp +99 -0
  288. data/ext/boost/preprocessor/iteration/detail/finish.hpp +99 -0
  289. data/ext/boost/preprocessor/iteration/detail/iter/forward3.hpp +1338 -0
  290. data/ext/boost/preprocessor/iteration/detail/iter/forward4.hpp +1338 -0
  291. data/ext/boost/preprocessor/iteration/detail/iter/forward5.hpp +1338 -0
  292. data/ext/boost/preprocessor/iteration/detail/iter/reverse2.hpp +1296 -0
  293. data/ext/boost/preprocessor/iteration/detail/iter/reverse3.hpp +1296 -0
  294. data/ext/boost/preprocessor/iteration/detail/iter/reverse4.hpp +1296 -0
  295. data/ext/boost/preprocessor/iteration/detail/iter/reverse5.hpp +1296 -0
  296. data/ext/boost/preprocessor/iteration/detail/local.hpp +812 -0
  297. data/ext/boost/preprocessor/iteration/detail/rlocal.hpp +782 -0
  298. data/ext/boost/preprocessor/iteration/detail/self.hpp +21 -0
  299. data/ext/boost/preprocessor/iteration/detail/start.hpp +99 -0
  300. data/ext/boost/preprocessor/iteration/local.hpp +26 -0
  301. data/ext/boost/preprocessor/iteration/self.hpp +19 -0
  302. data/ext/boost/preprocessor/library.hpp +36 -0
  303. data/ext/boost/preprocessor/limits.hpp +17 -0
  304. data/ext/boost/preprocessor/list.hpp +37 -0
  305. data/ext/boost/preprocessor/list/at.hpp +39 -0
  306. data/ext/boost/preprocessor/list/cat.hpp +42 -0
  307. data/ext/boost/preprocessor/list/detail/dmc/fold_left.hpp +279 -0
  308. data/ext/boost/preprocessor/list/detail/edg/fold_left.hpp +536 -0
  309. data/ext/boost/preprocessor/list/detail/edg/fold_right.hpp +794 -0
  310. data/ext/boost/preprocessor/list/enum.hpp +41 -0
  311. data/ext/boost/preprocessor/list/filter.hpp +54 -0
  312. data/ext/boost/preprocessor/list/first_n.hpp +58 -0
  313. data/ext/boost/preprocessor/list/for_each.hpp +49 -0
  314. data/ext/boost/preprocessor/list/for_each_product.hpp +141 -0
  315. data/ext/boost/preprocessor/list/rest_n.hpp +55 -0
  316. data/ext/boost/preprocessor/list/size.hpp +58 -0
  317. data/ext/boost/preprocessor/list/to_array.hpp +123 -0
  318. data/ext/boost/preprocessor/list/to_seq.hpp +32 -0
  319. data/ext/boost/preprocessor/list/to_tuple.hpp +38 -0
  320. data/ext/boost/preprocessor/logical.hpp +29 -0
  321. data/ext/boost/preprocessor/logical/bitnor.hpp +38 -0
  322. data/ext/boost/preprocessor/logical/bitor.hpp +38 -0
  323. data/ext/boost/preprocessor/logical/bitxor.hpp +38 -0
  324. data/ext/boost/preprocessor/logical/nor.hpp +30 -0
  325. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  326. data/ext/boost/preprocessor/logical/or.hpp +30 -0
  327. data/ext/boost/preprocessor/logical/xor.hpp +30 -0
  328. data/ext/boost/preprocessor/max.hpp +17 -0
  329. data/ext/boost/preprocessor/min.hpp +17 -0
  330. data/ext/boost/preprocessor/punctuation.hpp +20 -0
  331. data/ext/boost/preprocessor/punctuation/paren_if.hpp +38 -0
  332. data/ext/boost/preprocessor/repeat_3rd.hpp +17 -0
  333. data/ext/boost/preprocessor/repeat_from_to.hpp +17 -0
  334. data/ext/boost/preprocessor/repeat_from_to_2nd.hpp +17 -0
  335. data/ext/boost/preprocessor/repeat_from_to_3rd.hpp +17 -0
  336. data/ext/boost/preprocessor/repetition.hpp +32 -0
  337. data/ext/boost/preprocessor/repetition/deduce_r.hpp +22 -0
  338. data/ext/boost/preprocessor/repetition/deduce_z.hpp +22 -0
  339. data/ext/boost/preprocessor/repetition/detail/dmc/for.hpp +536 -0
  340. data/ext/boost/preprocessor/repetition/detail/edg/for.hpp +534 -0
  341. data/ext/boost/preprocessor/repetition/detail/msvc/for.hpp +277 -0
  342. data/ext/boost/preprocessor/repetition/enum_params_with_defaults.hpp +24 -0
  343. data/ext/boost/preprocessor/repetition/enum_shifted.hpp +68 -0
  344. data/ext/boost/preprocessor/repetition/enum_shifted_binary_params.hpp +51 -0
  345. data/ext/boost/preprocessor/repetition/enum_trailing.hpp +63 -0
  346. data/ext/boost/preprocessor/repetition/enum_trailing_binary_params.hpp +53 -0
  347. data/ext/boost/preprocessor/selection.hpp +18 -0
  348. data/ext/boost/preprocessor/selection/max.hpp +39 -0
  349. data/ext/boost/preprocessor/selection/min.hpp +39 -0
  350. data/ext/boost/preprocessor/seq.hpp +43 -0
  351. data/ext/boost/preprocessor/seq/cat.hpp +49 -0
  352. data/ext/boost/preprocessor/seq/detail/binary_transform.hpp +40 -0
  353. data/ext/boost/preprocessor/seq/detail/split.hpp +284 -0
  354. data/ext/boost/preprocessor/seq/filter.hpp +54 -0
  355. data/ext/boost/preprocessor/seq/first_n.hpp +30 -0
  356. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  357. data/ext/boost/preprocessor/seq/fold_right.hpp +288 -0
  358. data/ext/boost/preprocessor/seq/for_each.hpp +60 -0
  359. data/ext/boost/preprocessor/seq/for_each_product.hpp +126 -0
  360. data/ext/boost/preprocessor/seq/insert.hpp +28 -0
  361. data/ext/boost/preprocessor/seq/pop_back.hpp +29 -0
  362. data/ext/boost/preprocessor/seq/pop_front.hpp +27 -0
  363. data/ext/boost/preprocessor/seq/push_back.hpp +19 -0
  364. data/ext/boost/preprocessor/seq/push_front.hpp +19 -0
  365. data/ext/boost/preprocessor/seq/remove.hpp +29 -0
  366. data/ext/boost/preprocessor/seq/replace.hpp +29 -0
  367. data/ext/boost/preprocessor/seq/rest_n.hpp +30 -0
  368. data/ext/boost/preprocessor/seq/reverse.hpp +39 -0
  369. data/ext/boost/preprocessor/seq/subseq.hpp +28 -0
  370. data/ext/boost/preprocessor/seq/to_array.hpp +28 -0
  371. data/ext/boost/preprocessor/seq/to_list.hpp +29 -0
  372. data/ext/boost/preprocessor/seq/to_tuple.hpp +27 -0
  373. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  374. data/ext/boost/preprocessor/slot.hpp +17 -0
  375. data/ext/boost/preprocessor/slot/counter.hpp +25 -0
  376. data/ext/boost/preprocessor/slot/detail/counter.hpp +269 -0
  377. data/ext/boost/preprocessor/slot/detail/slot1.hpp +267 -0
  378. data/ext/boost/preprocessor/slot/detail/slot2.hpp +267 -0
  379. data/ext/boost/preprocessor/slot/detail/slot3.hpp +267 -0
  380. data/ext/boost/preprocessor/slot/detail/slot4.hpp +267 -0
  381. data/ext/boost/preprocessor/slot/detail/slot5.hpp +267 -0
  382. data/ext/boost/preprocessor/tuple.hpp +28 -0
  383. data/ext/boost/preprocessor/tuple/enum.hpp +22 -0
  384. data/ext/boost/preprocessor/tuple/reverse.hpp +114 -0
  385. data/ext/boost/preprocessor/tuple/size.hpp +28 -0
  386. data/ext/boost/preprocessor/tuple/to_array.hpp +37 -0
  387. data/ext/boost/preprocessor/tuple/to_seq.hpp +114 -0
  388. data/ext/boost/preprocessor/variadic.hpp +23 -0
  389. data/ext/boost/preprocessor/variadic/to_array.hpp +32 -0
  390. data/ext/boost/preprocessor/variadic/to_list.hpp +25 -0
  391. data/ext/boost/preprocessor/variadic/to_seq.hpp +25 -0
  392. data/ext/boost/preprocessor/variadic/to_tuple.hpp +24 -0
  393. data/ext/boost/preprocessor/while.hpp +17 -0
  394. data/ext/boost/preprocessor/wstringize.hpp +29 -0
  395. data/ext/boost/smart_ptr/intrusive_ptr.hpp +324 -0
  396. data/ext/common/AccountsDatabase.h +3 -4
  397. data/ext/common/AgentsStarter.cpp +12 -15
  398. data/ext/common/AgentsStarter.h +54 -120
  399. data/ext/common/ApplicationPool2/AppTypes.cpp +12 -5
  400. data/ext/common/ApplicationPool2/AppTypes.h +21 -14
  401. data/ext/common/ApplicationPool2/Common.h +36 -19
  402. data/ext/common/ApplicationPool2/DirectSpawner.h +15 -16
  403. data/ext/common/ApplicationPool2/DummySpawner.h +9 -8
  404. data/ext/common/ApplicationPool2/ErrorRenderer.h +1 -1
  405. data/ext/common/ApplicationPool2/Group.h +304 -171
  406. data/ext/common/ApplicationPool2/Implementation.cpp +234 -125
  407. data/ext/common/ApplicationPool2/Options.h +50 -62
  408. data/ext/common/ApplicationPool2/Pool.h +285 -189
  409. data/ext/common/ApplicationPool2/Process.h +126 -115
  410. data/ext/common/ApplicationPool2/Session.h +70 -30
  411. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -18
  412. data/ext/common/ApplicationPool2/Socket.h +57 -43
  413. data/ext/common/ApplicationPool2/SpawnObject.h +83 -0
  414. data/ext/common/ApplicationPool2/Spawner.h +59 -38
  415. data/ext/common/ApplicationPool2/SpawnerFactory.h +8 -14
  416. data/ext/common/ApplicationPool2/SuperGroup.h +69 -40
  417. data/ext/common/BackgroundEventLoop.cpp +48 -1
  418. data/ext/common/BackgroundEventLoop.h +3 -1
  419. data/ext/common/Constants.h +30 -8
  420. data/ext/common/DataStructures/HashedStaticString.h +103 -0
  421. data/ext/common/DataStructures/LString.h +396 -0
  422. data/ext/common/DataStructures/StringKeyTable.h +588 -0
  423. data/ext/common/EventedMessageServer.h +1 -0
  424. data/ext/common/FileDescriptor.h +5 -0
  425. data/ext/common/InstanceDirectory.h +240 -0
  426. data/ext/common/Logging.cpp +38 -13
  427. data/ext/common/Logging.h +53 -22
  428. data/ext/common/MemoryKit/mbuf.cpp +413 -0
  429. data/ext/common/MemoryKit/mbuf.h +266 -0
  430. data/ext/common/MemoryKit/palloc.cpp +337 -0
  431. data/ext/common/MemoryKit/palloc.h +121 -0
  432. data/ext/common/ResourceLocator.h +62 -6
  433. data/ext/common/SafeLibev.h +4 -4
  434. data/ext/common/ServerKit/AcceptLoadBalancer.h +275 -0
  435. data/ext/common/ServerKit/Channel.h +747 -0
  436. data/ext/common/ServerKit/Client.h +166 -0
  437. data/ext/common/ServerKit/ClientRef.h +130 -0
  438. data/ext/common/ServerKit/Context.h +129 -0
  439. data/ext/common/ServerKit/Errors.h +103 -0
  440. data/ext/common/ServerKit/FdSinkChannel.h +206 -0
  441. data/ext/common/ServerKit/FdSourceChannel.h +230 -0
  442. data/ext/common/ServerKit/FileBufferedChannel.h +1399 -0
  443. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +228 -0
  444. data/ext/common/ServerKit/HeaderTable.h +472 -0
  445. data/ext/common/ServerKit/Hooks.h +79 -0
  446. data/ext/common/ServerKit/HttpChunkedBodyParser.h +289 -0
  447. data/ext/common/ServerKit/HttpChunkedBodyParserState.h +70 -0
  448. data/ext/common/ServerKit/HttpClient.h +94 -0
  449. data/ext/common/ServerKit/HttpHeaderParser.h +477 -0
  450. data/ext/common/ServerKit/HttpHeaderParserState.h +60 -0
  451. data/ext/common/ServerKit/HttpRequest.h +276 -0
  452. data/ext/common/ServerKit/HttpRequestRef.h +130 -0
  453. data/ext/common/ServerKit/HttpServer.h +1152 -0
  454. data/ext/common/ServerKit/Implementation.cpp +47 -0
  455. data/ext/common/ServerKit/Server.h +1040 -0
  456. data/ext/common/ServerKit/http_parser.cpp +2259 -0
  457. data/ext/common/ServerKit/http_parser.h +330 -0
  458. data/ext/common/StaticString.h +8 -0
  459. data/ext/common/Utils.cpp +14 -12
  460. data/ext/common/Utils.h +9 -103
  461. data/ext/common/Utils/BufferedIO.h +1 -0
  462. data/ext/common/Utils/CachedFileStat.hpp +1 -7
  463. data/ext/common/Utils/DateParsing.h +379 -0
  464. data/ext/common/Utils/FileChangeChecker.h +3 -9
  465. data/ext/common/Utils/Hasher.cpp +52 -0
  466. data/ext/common/Utils/Hasher.h +58 -0
  467. data/ext/common/Utils/IOUtils.cpp +62 -62
  468. data/ext/common/Utils/JsonUtils.h +21 -0
  469. data/ext/common/Utils/OptionParsing.h +75 -0
  470. data/ext/common/Utils/StrIntUtils.cpp +112 -19
  471. data/ext/common/Utils/StrIntUtils.h +52 -12
  472. data/ext/common/Utils/StrIntUtilsNoStrictAliasing.cpp +174 -0
  473. data/ext/common/Utils/VariantMap.h +18 -7
  474. data/ext/common/Utils/modp_b64.cpp +290 -0
  475. data/ext/common/Utils/modp_b64.h +241 -0
  476. data/ext/common/Utils/modp_b64_data.h +479 -0
  477. data/ext/common/Utils/sysqueue.h +811 -0
  478. data/ext/common/agents/Base.cpp +71 -98
  479. data/ext/common/agents/Base.h +11 -3
  480. data/ext/common/agents/HelperAgent/AdminServer.h +690 -0
  481. data/ext/common/agents/HelperAgent/Main.cpp +899 -487
  482. data/ext/common/agents/HelperAgent/OptionParser.h +311 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.h +315 -2548
  484. data/ext/common/agents/HelperAgent/RequestHandler/AppResponse.h +225 -0
  485. data/ext/common/agents/HelperAgent/RequestHandler/BufferBody.cpp +93 -0
  486. data/ext/common/agents/HelperAgent/RequestHandler/CheckoutSession.cpp +346 -0
  487. data/ext/common/agents/HelperAgent/RequestHandler/Client.h +54 -0
  488. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +846 -0
  489. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +231 -0
  490. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +434 -0
  491. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +149 -0
  492. data/ext/common/agents/HelperAgent/RequestHandler/SendRequest.cpp +887 -0
  493. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +293 -0
  494. data/ext/common/agents/HelperAgent/RequestHandler/Utils.cpp +301 -0
  495. data/ext/common/agents/HelperAgent/ResponseCache.h +624 -0
  496. data/ext/common/agents/HelperAgent/SystemMetricsTool.cpp +21 -23
  497. data/ext/common/agents/LoggingAgent/AdminServer.h +369 -0
  498. data/ext/common/agents/LoggingAgent/LoggingServer.h +1 -0
  499. data/ext/common/agents/LoggingAgent/Main.cpp +422 -215
  500. data/ext/common/agents/LoggingAgent/OptionParser.h +167 -0
  501. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  502. data/ext/common/agents/Main.cpp +107 -0
  503. data/ext/common/agents/SpawnPreparer/Main.cpp +207 -0
  504. data/ext/common/agents/TempDirToucher/Main.cpp +429 -0
  505. data/ext/common/agents/Watchdog/AdminServer.h +390 -0
  506. data/ext/common/agents/Watchdog/AgentWatcher.cpp +7 -5
  507. data/ext/common/agents/Watchdog/HelperAgentWatcher.cpp +18 -39
  508. data/ext/common/agents/Watchdog/InstanceDirToucher.cpp +116 -0
  509. data/ext/common/agents/Watchdog/LoggingAgentWatcher.cpp +13 -17
  510. data/ext/common/agents/Watchdog/Main.cpp +743 -202
  511. data/ext/libeio/eio.c +17 -0
  512. data/ext/libeio/eio.h +2 -0
  513. data/ext/nginx/CacheLocationConfig.c +177 -198
  514. data/ext/nginx/CacheLocationConfig.c.erb +35 -22
  515. data/ext/nginx/Configuration.c +402 -236
  516. data/ext/nginx/Configuration.h +12 -5
  517. data/ext/nginx/ConfigurationCommands.c +35 -15
  518. data/ext/nginx/ConfigurationCommands.c.erb +4 -4
  519. data/ext/nginx/ConfigurationFields.h +9 -5
  520. data/ext/nginx/ConfigurationFields.h.erb +3 -1
  521. data/ext/nginx/ContentHandler.c +393 -362
  522. data/ext/nginx/CreateLocationConfig.c +8 -4
  523. data/ext/nginx/CreateLocationConfig.c.erb +8 -3
  524. data/ext/nginx/MergeLocationConfig.c +36 -6
  525. data/ext/nginx/MergeLocationConfig.c.erb +42 -1
  526. data/ext/nginx/ngx_http_passenger_module.c +28 -15
  527. data/ext/oxt/detail/backtrace_disabled.hpp +2 -1
  528. data/ext/oxt/detail/backtrace_enabled.hpp +15 -2
  529. data/ext/oxt/implementation.cpp +92 -20
  530. data/ext/oxt/thread.hpp +5 -0
  531. data/ext/ruby/extconf.rb +3 -6
  532. data/ext/ruby/passenger_native_support.c +13 -40
  533. data/helper-scripts/download_binaries/extconf.rb +4 -4
  534. data/helper-scripts/meteor-loader.rb +12 -112
  535. data/helper-scripts/node-loader.js +3 -91
  536. data/helper-scripts/rack-loader.rb +13 -14
  537. data/helper-scripts/rack-preloader.rb +16 -17
  538. data/helper-scripts/wsgi-loader.py +11 -7
  539. data/lib/phusion_passenger.rb +100 -79
  540. data/lib/phusion_passenger/abstract_installer.rb +28 -3
  541. data/lib/phusion_passenger/admin_tools.rb +3 -3
  542. data/lib/phusion_passenger/admin_tools/instance.rb +207 -0
  543. data/lib/phusion_passenger/admin_tools/instance_registry.rb +98 -0
  544. data/lib/phusion_passenger/apache2/config_options.rb +72 -22
  545. data/lib/phusion_passenger/common_library.rb +79 -14
  546. data/lib/phusion_passenger/config/about_command.rb +17 -23
  547. data/lib/phusion_passenger/config/admin_command_command.rb +175 -0
  548. data/lib/phusion_passenger/config/agent_compiler.rb +170 -0
  549. data/lib/phusion_passenger/config/command.rb +1 -4
  550. data/lib/phusion_passenger/config/compile_agent_command.rb +102 -0
  551. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +112 -0
  552. data/lib/phusion_passenger/config/detach_process_command.rb +32 -10
  553. data/lib/phusion_passenger/config/download_agent_command.rb +285 -0
  554. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +281 -0
  555. data/lib/phusion_passenger/config/install_agent_command.rb +174 -0
  556. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +231 -0
  557. data/lib/phusion_passenger/config/installation_utils.rb +241 -0
  558. data/lib/phusion_passenger/config/list_instances_command.rb +13 -25
  559. data/lib/phusion_passenger/config/main.rb +43 -14
  560. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +337 -0
  561. data/lib/phusion_passenger/config/reopen_logs_command.rb +110 -0
  562. data/lib/phusion_passenger/config/restart_app_command.rb +61 -14
  563. data/lib/phusion_passenger/config/system_metrics_command.rb +2 -1
  564. data/lib/phusion_passenger/config/utils.rb +64 -39
  565. data/lib/phusion_passenger/config/validate_install_command.rb +2 -2
  566. data/lib/phusion_passenger/constants.rb +27 -6
  567. data/lib/phusion_passenger/debug_logging.rb +32 -15
  568. data/lib/phusion_passenger/loader_shared_helpers.rb +2 -5
  569. data/lib/phusion_passenger/message_client.rb +21 -22
  570. data/lib/phusion_passenger/native_support.rb +26 -31
  571. data/lib/phusion_passenger/nginx/config_options.rb +32 -19
  572. data/lib/phusion_passenger/packaging.rb +7 -3
  573. data/lib/phusion_passenger/platform_info/cxx_portability.rb +1 -2
  574. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +3 -4
  575. data/lib/phusion_passenger/platform_info/operating_system.rb +6 -6
  576. data/lib/phusion_passenger/preloader_shared_helpers.rb +2 -2
  577. data/lib/phusion_passenger/rack/out_of_band_gc.rb +2 -2
  578. data/lib/phusion_passenger/rack/thread_handler_extension.rb +168 -65
  579. data/lib/phusion_passenger/request_handler.rb +47 -82
  580. data/lib/phusion_passenger/request_handler/thread_handler.rb +46 -10
  581. data/lib/phusion_passenger/ruby_core_enhancements.rb +25 -77
  582. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +108 -0
  583. data/lib/phusion_passenger/standalone/app_finder.rb +39 -59
  584. data/lib/phusion_passenger/standalone/command.rb +27 -275
  585. data/lib/phusion_passenger/standalone/command2.rb +292 -0
  586. data/lib/phusion_passenger/standalone/config_utils.rb +87 -0
  587. data/lib/phusion_passenger/standalone/control_utils.rb +88 -0
  588. data/lib/phusion_passenger/standalone/main.rb +69 -71
  589. data/lib/phusion_passenger/standalone/start2_command.rb +799 -0
  590. data/lib/phusion_passenger/standalone/start_command.rb +406 -467
  591. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +167 -0
  592. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +165 -0
  593. data/lib/phusion_passenger/standalone/status_command.rb +64 -23
  594. data/lib/phusion_passenger/standalone/stop_command.rb +69 -32
  595. data/lib/phusion_passenger/standalone/version_command.rb +1 -5
  596. data/lib/phusion_passenger/utils.rb +0 -4
  597. data/lib/phusion_passenger/utils/json.rb +70 -4
  598. data/lib/phusion_passenger/utils/progress_bar.rb +56 -0
  599. data/lib/phusion_passenger/utils/tee_input.rb +3 -3
  600. data/lib/phusion_passenger/utils/unseekable_socket.rb +30 -0
  601. data/packaging/rpm/nginx_spec/nginx.spec.template +4 -3
  602. data/packaging/rpm/passenger_spec/passenger.spec.template +6 -10
  603. data/packaging/rpm/setup-system +2 -1
  604. data/resources/oss-binaries.phusionpassenger.com.crt +208 -0
  605. data/resources/templates/config/agent_compiler/confirm_enable_optimizations.txt.erb +5 -0
  606. data/resources/templates/config/installation_utils/cannot_create_user_support_binaries_dir.txt.erb +15 -0
  607. data/resources/templates/config/installation_utils/download_tool_missing.txt.erb +7 -0
  608. data/resources/templates/config/installation_utils/passenger_not_installed_as_root.txt.erb +12 -0
  609. data/resources/templates/config/installation_utils/support_binaries_dir_not_writable_despite_running_as_root.txt.erb +13 -0
  610. data/resources/templates/config/installation_utils/unexpected_filesystem_problem.txt.erb +16 -0
  611. data/{packaging/debian/debian_specs/passenger/patches/series → resources/templates/config/installation_utils/user_support_binaries_dir_not_writable.txt.erb} +0 -0
  612. data/resources/templates/nginx/nginx_module_sources_not_available.txt.erb +2 -2
  613. data/resources/templates/standalone/config.erb +14 -16
  614. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +1 -1
  615. data/test/.rspec +1 -0
  616. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +20 -17
  617. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -14
  618. data/test/cxx/ApplicationPool2/PoolTest.cpp +113 -90
  619. data/test/cxx/ApplicationPool2/ProcessTest.cpp +18 -27
  620. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +51 -53
  621. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +55 -57
  622. data/test/cxx/BufferedIOTest.cpp +40 -40
  623. data/test/cxx/CxxTestMain.cpp +4 -22
  624. data/test/cxx/DataStructures/LStringTest.cpp +275 -0
  625. data/test/cxx/DataStructures/StringKeyTableTest.cpp +199 -0
  626. data/test/cxx/MemoryKit/MbufTest.cpp +213 -0
  627. data/test/cxx/MessageServerTest.cpp +62 -55
  628. data/test/cxx/RequestHandlerTest.cpp +26 -27
  629. data/test/cxx/ServerKit/ChannelTest.cpp +1467 -0
  630. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +817 -0
  631. data/test/cxx/ServerKit/HeaderTableTest.cpp +171 -0
  632. data/test/cxx/ServerKit/HttpServerTest.cpp +1503 -0
  633. data/test/cxx/ServerKit/ServerTest.cpp +408 -0
  634. data/test/cxx/TestSupport.cpp +51 -15
  635. data/test/cxx/TestSupport.h +31 -21
  636. data/test/cxx/UnionStationTest.cpp +121 -122
  637. data/test/cxx/UtilsTest.cpp +9 -33
  638. data/test/integration_tests/apache2_tests.rb +65 -27
  639. data/test/integration_tests/downloaded_binaries_tests.rb +30 -6
  640. data/test/integration_tests/native_packaging_spec.rb +32 -17
  641. data/test/integration_tests/nginx_tests.rb +28 -10
  642. data/test/integration_tests/shared/example_webapp_tests.rb +40 -27
  643. data/test/integration_tests/standalone_tests.rb +232 -169
  644. data/test/ruby/debug_logging_spec.rb +44 -40
  645. data/test/ruby/rails3.0/preloader_spec.rb +1 -1
  646. data/test/ruby/rails3.1/preloader_spec.rb +1 -1
  647. data/test/ruby/rails3.2/preloader_spec.rb +1 -1
  648. data/test/ruby/rails4.0/preloader_spec.rb +1 -1
  649. data/test/ruby/rails4.1/preloader_spec.rb +1 -1
  650. data/test/ruby/request_handler_spec.rb +62 -24
  651. data/test/ruby/shared/loader_sharedspec.rb +10 -9
  652. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +23 -22
  653. data/test/ruby/spec_helper.rb +2 -11
  654. data/test/ruby/standalone/runtime_installer_spec.rb +15 -13
  655. data/test/ruby/union_station_spec.rb +45 -40
  656. data/test/ruby/utils/tee_input_spec.rb +5 -5
  657. data/test/ruby/utils_spec.rb +3 -39
  658. data/test/stub/apache2/httpd.conf.erb +5 -2
  659. data/test/stub/nginx/nginx.conf.erb +3 -1
  660. data/test/support/apache2_controller.rb +25 -25
  661. data/test/support/nginx_controller.rb +14 -14
  662. data/test/support/test_helper.rb +74 -75
  663. metadata +439 -643
  664. metadata.gz.asc +7 -7
  665. data/ext/common/MultiLibeio.cpp +0 -204
  666. data/ext/common/MultiLibeio.h +0 -67
  667. data/ext/common/ServerInstanceDir.h +0 -402
  668. data/ext/common/Utils/Base64.cpp +0 -143
  669. data/ext/common/Utils/Base64.h +0 -83
  670. data/ext/common/Utils/HttpHeaderBufferer.h +0 -184
  671. data/ext/common/Utils/PriorityQueue.h +0 -54
  672. data/ext/common/Utils/StreamBoyerMooreHorspool.h +0 -512
  673. data/ext/common/Utils/fib.c +0 -699
  674. data/ext/common/Utils/fib.h +0 -101
  675. data/ext/common/Utils/fibpriv.h +0 -67
  676. data/ext/common/agents/EnvPrinter.c +0 -16
  677. data/ext/common/agents/HelperAgent/AgentOptions.h +0 -109
  678. data/ext/common/agents/HelperAgent/FileBackedPipe.h +0 -732
  679. data/ext/common/agents/HelperAgent/RequestHandler.cpp +0 -294
  680. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +0 -457
  681. data/ext/common/agents/LoggingAgent/AdminController.h +0 -96
  682. data/ext/common/agents/SpawnPreparer.cpp +0 -206
  683. data/ext/common/agents/TempDirToucher.c +0 -383
  684. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +0 -116
  685. data/helper-scripts/classic-rails-loader.rb +0 -166
  686. data/helper-scripts/classic-rails-preloader.rb +0 -193
  687. data/lib/phusion_passenger/admin_tools/server_instance.rb +0 -339
  688. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +0 -68
  689. data/lib/phusion_passenger/classic_rails/thread_handler_extension.rb +0 -40
  690. data/lib/phusion_passenger/platform_info/openssl.rb +0 -61
  691. data/lib/phusion_passenger/standalone/config_file.rb +0 -119
  692. data/lib/phusion_passenger/standalone/help_command.rb +0 -57
  693. data/lib/phusion_passenger/standalone/runtime_installer.rb +0 -712
  694. data/lib/phusion_passenger/standalone/runtime_locator.rb +0 -170
  695. data/lib/phusion_passenger/standalone/utils.rb +0 -58
  696. data/lib/phusion_passenger/utils/tmpdir.rb +0 -69
  697. data/packaging/debian/LICENSE.md +0 -19
  698. data/packaging/debian/README.md +0 -320
  699. data/packaging/debian/Vagrantfile +0 -25
  700. data/packaging/debian/build +0 -210
  701. data/packaging/debian/debian_specs/nginx/changelog +0 -1989
  702. data/packaging/debian/debian_specs/nginx/compat.erb +0 -5
  703. data/packaging/debian/debian_specs/nginx/conf/fastcgi.conf +0 -25
  704. data/packaging/debian/debian_specs/nginx/conf/fastcgi_params +0 -24
  705. data/packaging/debian/debian_specs/nginx/conf/koi-utf +0 -109
  706. data/packaging/debian/debian_specs/nginx/conf/koi-win +0 -103
  707. data/packaging/debian/debian_specs/nginx/conf/mime.types +0 -89
  708. data/packaging/debian/debian_specs/nginx/conf/nginx.conf.erb +0 -97
  709. data/packaging/debian/debian_specs/nginx/conf/proxy_params +0 -4
  710. data/packaging/debian/debian_specs/nginx/conf/scgi_params +0 -16
  711. data/packaging/debian/debian_specs/nginx/conf/sites-available/default.erb +0 -93
  712. data/packaging/debian/debian_specs/nginx/conf/snippets/fastcgi-php.conf +0 -13
  713. data/packaging/debian/debian_specs/nginx/conf/snippets/snakeoil.conf +0 -5
  714. data/packaging/debian/debian_specs/nginx/conf/uwsgi_params +0 -16
  715. data/packaging/debian/debian_specs/nginx/conf/win-utf +0 -125
  716. data/packaging/debian/debian_specs/nginx/control.erb +0 -226
  717. data/packaging/debian/debian_specs/nginx/copyright +0 -196
  718. data/packaging/debian/debian_specs/nginx/debian-full.lintian-overrides +0 -1
  719. data/packaging/debian/debian_specs/nginx/gbp.conf +0 -2
  720. data/packaging/debian/debian_specs/nginx/help/docs/fcgiwrap +0 -14
  721. data/packaging/debian/debian_specs/nginx/help/docs/php +0 -119
  722. data/packaging/debian/debian_specs/nginx/help/docs/support-irc +0 -28
  723. data/packaging/debian/debian_specs/nginx/help/docs/upstream +0 -51
  724. data/packaging/debian/debian_specs/nginx/help/examples/drupal +0 -114
  725. data/packaging/debian/debian_specs/nginx/help/examples/http +0 -59
  726. data/packaging/debian/debian_specs/nginx/help/examples/mail +0 -30
  727. data/packaging/debian/debian_specs/nginx/help/examples/mailman +0 -59
  728. data/packaging/debian/debian_specs/nginx/help/examples/nginx.conf +0 -34
  729. data/packaging/debian/debian_specs/nginx/help/examples/nginx_modsite +0 -162
  730. data/packaging/debian/debian_specs/nginx/help/examples/virtual_hosts +0 -155
  731. data/packaging/debian/debian_specs/nginx/help/examples/wordpress +0 -74
  732. data/packaging/debian/debian_specs/nginx/helpers.rb +0 -41
  733. data/packaging/debian/debian_specs/nginx/index-debian.html.in +0 -32
  734. data/packaging/debian/debian_specs/nginx/index-ubuntu.html.in +0 -32
  735. data/packaging/debian/debian_specs/nginx/index.html.erb +0 -10
  736. data/packaging/debian/debian_specs/nginx/modules/README.Modules-versions +0 -65
  737. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/README.markdown +0 -510
  738. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/config +0 -5
  739. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/doc/HttpHeadersMoreModule.wiki +0 -395
  740. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ddebug.h +0 -119
  741. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.c +0 -348
  742. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_filter_module.h +0 -80
  743. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.c +0 -826
  744. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_in.h +0 -26
  745. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.c +0 -716
  746. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_headers_out.h +0 -26
  747. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.c +0 -380
  748. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/src/ngx_http_headers_more_util.h +0 -52
  749. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/util/build.sh +0 -32
  750. data/packaging/debian/debian_specs/nginx/modules/headers-more-nginx-module/valgrind.suppress +0 -215
  751. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ChangeLog +0 -35
  752. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/LICENSE +0 -25
  753. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/README.md +0 -93
  754. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/config +0 -4
  755. data/packaging/debian/debian_specs/nginx/modules/nginx-auth-pam/ngx_http_auth_pam_module.c +0 -462
  756. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/CHANGES +0 -66
  757. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/LICENSE +0 -26
  758. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/README.md +0 -171
  759. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/TODO.md +0 -7
  760. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/config +0 -21
  761. data/packaging/debian/debian_specs/nginx/modules/nginx-cache-purge/ngx_cache_purge_module.c +0 -1803
  762. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/README +0 -29
  763. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/config +0 -9
  764. data/packaging/debian/debian_specs/nginx/modules/nginx-dav-ext-module/ngx_http_dav_ext_module.c +0 -824
  765. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README +0 -139
  766. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/README_AUTO_LIB +0 -395
  767. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/TODO +0 -1
  768. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/array +0 -10
  769. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/actions/palloc +0 -8
  770. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/build +0 -597
  771. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_replacements +0 -5
  772. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/action_types +0 -12
  773. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_args +0 -22
  774. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_locs +0 -25
  775. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/conf_macros +0 -35
  776. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/contexts +0 -22
  777. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/header_files +0 -3
  778. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/headers +0 -4
  779. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/module_dependencies +0 -5
  780. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/modules_optional +0 -15
  781. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/data/prefixes +0 -2
  782. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/array.h +0 -7
  783. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_cmd_basic.h +0 -43
  784. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/conf_merge.h +0 -78
  785. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/src/palloc.h +0 -6
  786. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/auto/text/autogen +0 -12
  787. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/config +0 -49
  788. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/action_macros +0 -63
  789. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/core/conf_cmds +0 -62
  790. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/modules/set_var +0 -124
  791. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/patches/more_logging_info +0 -48
  792. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/docs/upstream/list +0 -45
  793. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/README +0 -12
  794. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/config +0 -4
  795. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/examples/http/set_var/ngx_http_set_var_examples_module.c +0 -136
  796. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/ngx_auto_lib_core +0 -797
  797. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/CHANGES +0 -17
  798. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/notes/LICENSE +0 -24
  799. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_array.h +0 -113
  800. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_basic.h +0 -2203
  801. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_cmd_extra.h +0 -5423
  802. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_conf_merge.h +0 -227
  803. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.c +0 -72
  804. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_config.h +0 -98
  805. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_includes.h +0 -66
  806. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/objs/ndk_palloc.h +0 -112
  807. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/auto_config +0 -16
  808. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/expose_rewrite_functions +0 -291
  809. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/patches/rewrite_phase_handler +0 -19
  810. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/md5.h +0 -117
  811. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/murmurhash2.c +0 -77
  812. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/hash/sha.h +0 -200
  813. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.c +0 -155
  814. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk.h +0 -58
  815. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.c +0 -43
  816. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_buf.h +0 -5
  817. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.c +0 -129
  818. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_path.h +0 -30
  819. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.c +0 -192
  820. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_complex_value.h +0 -21
  821. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.c +0 -396
  822. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_conf_file.h +0 -44
  823. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.c +0 -72
  824. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_debug.h +0 -171
  825. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.c +0 -57
  826. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_encoding.h +0 -12
  827. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.c +0 -82
  828. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_hash.h +0 -45
  829. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.c +0 -138
  830. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http.h +0 -3
  831. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_http_headers.h +0 -35
  832. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.c +0 -3
  833. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_log.h +0 -165
  834. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_parse.h +0 -67
  835. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.c +0 -583
  836. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_path.h +0 -22
  837. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.c +0 -20
  838. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_process.h +0 -12
  839. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.c +0 -215
  840. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_regex.h +0 -7
  841. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.c +0 -103
  842. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_rewrite.h +0 -26
  843. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.c +0 -602
  844. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_set_var.h +0 -44
  845. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.c +0 -434
  846. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string.h +0 -37
  847. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_string_util.h +0 -14
  848. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.c +0 -205
  849. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_upstream_list.h +0 -27
  850. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.c +0 -45
  851. data/packaging/debian/debian_specs/nginx/modules/nginx-development-kit/src/ndk_uri.h +0 -6
  852. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/LICENSE +0 -25
  853. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/README.markdown +0 -1850
  854. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/config +0 -5
  855. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/doc/HttpEchoModule.wiki +0 -1558
  856. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ddebug.h +0 -109
  857. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.c +0 -344
  858. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_echo.h +0 -25
  859. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.c +0 -282
  860. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_filter.h +0 -15
  861. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.c +0 -183
  862. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_foreach.h +0 -16
  863. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.c +0 -429
  864. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_handler.h +0 -18
  865. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.c +0 -178
  866. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_location.h +0 -13
  867. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.c +0 -667
  868. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_module.h +0 -137
  869. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.c +0 -452
  870. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_request_info.h +0 -31
  871. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.c +0 -208
  872. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_sleep.h +0 -16
  873. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.c +0 -788
  874. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_subrequest.h +0 -19
  875. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.c +0 -96
  876. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_timer.h +0 -13
  877. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.c +0 -298
  878. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_util.h +0 -58
  879. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.c +0 -110
  880. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/src/ngx_http_echo_var.h +0 -9
  881. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/build.sh +0 -45
  882. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/releng +0 -8
  883. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/util/wiki2pod.pl +0 -131
  884. data/packaging/debian/debian_specs/nginx/modules/nginx-echo/valgrind.suppress +0 -38
  885. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/LICENCE +0 -24
  886. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/README +0 -206
  887. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/changelog.txt +0 -54
  888. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/config +0 -26
  889. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/protocol.txt +0 -191
  890. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.c +0 -59
  891. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_defs.h +0 -73
  892. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.c +0 -783
  893. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module.h +0 -31
  894. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_module_setup.c +0 -361
  895. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/ngx_http_push_types.h +0 -120
  896. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.c +0 -1180
  897. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/memory/store.h +0 -1
  898. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.c +0 -146
  899. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_module_ipc.h +0 -5
  900. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_http_push_store.h +0 -51
  901. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.c +0 -178
  902. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/ngx_rwlock.h +0 -5
  903. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.c +0 -246
  904. data/packaging/debian/debian_specs/nginx/modules/nginx-http-push/src/store/rbtree_util.h +0 -9
  905. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/Changes +0 -51
  906. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/README.markdown +0 -6954
  907. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/config +0 -363
  908. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/doc/HttpLuaModule.wiki +0 -5898
  909. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/dtrace/ngx_lua_provider.d +0 -61
  910. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/Makefile +0 -3
  911. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/lib/RecvUntil.pm +0 -138
  912. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/misc/recv-until-pm/t/sanity.t +0 -140
  913. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/api/ngx_http_lua_api.h +0 -52
  914. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ddebug.h +0 -82
  915. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.c +0 -377
  916. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_accessby.h +0 -22
  917. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_api.c +0 -77
  918. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.c +0 -537
  919. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_args.h +0 -20
  920. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.c +0 -632
  921. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_bodyfilterby.h +0 -31
  922. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.c +0 -296
  923. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_cache.h +0 -24
  924. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.c +0 -175
  925. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_capturefilter.h +0 -20
  926. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.c +0 -887
  927. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_clfactory.h +0 -22
  928. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_common.h +0 -478
  929. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.c +0 -67
  930. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_config.h +0 -19
  931. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.c +0 -148
  932. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_consts.h +0 -20
  933. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.c +0 -369
  934. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_contentby.h +0 -26
  935. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.c +0 -483
  936. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_control.h +0 -20
  937. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.c +0 -379
  938. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_coroutine.h +0 -23
  939. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.c +0 -216
  940. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ctx.h +0 -23
  941. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.c +0 -1081
  942. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_directive.h +0 -56
  943. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.c +0 -58
  944. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_exception.h +0 -33
  945. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.c +0 -302
  946. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headerfilterby.h +0 -29
  947. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.c +0 -1370
  948. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers.h +0 -22
  949. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.c +0 -782
  950. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_in.h +0 -22
  951. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.c +0 -625
  952. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_headers_out.h +0 -23
  953. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.c +0 -42
  954. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initby.h +0 -23
  955. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.c +0 -320
  956. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_initworkerby.h +0 -25
  957. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.c +0 -300
  958. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_log.h +0 -20
  959. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.c +0 -227
  960. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_logby.h +0 -22
  961. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.c +0 -252
  962. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_misc.h +0 -20
  963. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_module.c +0 -924
  964. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.c +0 -184
  965. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_ndk.h +0 -21
  966. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.c +0 -794
  967. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_output.h +0 -28
  968. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.c +0 -106
  969. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_pcrefix.h +0 -23
  970. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.c +0 -94
  971. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_phase.h +0 -13
  972. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_probe.h +0 -85
  973. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.c +0 -2468
  974. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_regex.h +0 -22
  975. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.c +0 -1169
  976. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_body.h +0 -20
  977. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.c +0 -252
  978. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_req_method.h +0 -19
  979. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.c +0 -351
  980. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_rewriteby.h +0 -22
  981. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.c +0 -538
  982. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_script.h +0 -86
  983. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.c +0 -216
  984. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_setby.h +0 -15
  985. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.c +0 -1844
  986. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_shdict.h +0 -52
  987. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.c +0 -191
  988. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_sleep.h +0 -20
  989. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.c +0 -5314
  990. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_tcp.h +0 -156
  991. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.c +0 -1624
  992. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_socket_udp.h +0 -56
  993. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.c +0 -704
  994. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_string.h +0 -20
  995. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.c +0 -1741
  996. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_subrequest.h +0 -46
  997. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.c +0 -278
  998. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_time.h +0 -21
  999. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.c +0 -661
  1000. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_timer.h +0 -20
  1001. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.c +0 -110
  1002. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uri.h +0 -20
  1003. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.c +0 -283
  1004. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_uthread.h +0 -36
  1005. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.c +0 -3972
  1006. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_util.h +0 -423
  1007. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.c +0 -499
  1008. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_variable.h +0 -20
  1009. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.c +0 -64
  1010. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/src/ngx_http_lua_worker.h +0 -17
  1011. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/tapset/ngx_lua.stp +0 -5
  1012. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build.sh +0 -39
  1013. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/build2.sh +0 -55
  1014. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/fix-comments +0 -27
  1015. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/gdbinit +0 -415
  1016. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/ngx-links +0 -62
  1017. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/reindex +0 -64
  1018. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/releng +0 -8
  1019. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/retab +0 -8
  1020. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/revim +0 -102
  1021. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/run_test.sh +0 -10
  1022. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/util/update-readme.sh +0 -4
  1023. data/packaging/debian/debian_specs/nginx/modules/nginx-lua/valgrind.suppress +0 -144
  1024. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/CHANGES +0 -107
  1025. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/LICENSE +0 -25
  1026. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/Makefile +0 -8
  1027. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/README +0 -329
  1028. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/config +0 -3
  1029. data/packaging/debian/debian_specs/nginx/modules/nginx-upload-progress/ngx_http_uploadprogress_module.c +0 -1774
  1030. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/README +0 -53
  1031. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/config +0 -3
  1032. data/packaging/debian/debian_specs/nginx/modules/nginx-upstream-fair/ngx_http_upstream_fair_module.c +0 -1356
  1033. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/CHANGELOG.md +0 -37
  1034. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/HACKING.md +0 -24
  1035. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/LICENSE +0 -20
  1036. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/README.rst +0 -182
  1037. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/config +0 -8
  1038. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/nginx-0.6-support.patch +0 -23
  1039. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/ngx_http_fancyindex_module.c +0 -1305
  1040. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.awk +0 -52
  1041. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.h +0 -103
  1042. data/packaging/debian/debian_specs/nginx/modules/ngx-fancyindex/template.html +0 -102
  1043. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/CHANGES +0 -37
  1044. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/README +0 -141
  1045. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/config +0 -3
  1046. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.google_code_home_page.wiki +0 -120
  1047. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.html +0 -199
  1048. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/doc/README.wiki +0 -123
  1049. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/ngx_http_subs_filter_module.c +0 -1298
  1050. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/README +0 -275
  1051. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/AutoInstall.pm +0 -820
  1052. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install.pm +0 -470
  1053. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/AutoInstall.pm +0 -82
  1054. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Base.pm +0 -83
  1055. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Can.pm +0 -81
  1056. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Fetch.pm +0 -93
  1057. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Include.pm +0 -34
  1058. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Makefile.pm +0 -415
  1059. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Metadata.pm +0 -716
  1060. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/TestBase.pm +0 -29
  1061. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/Win32.pm +0 -64
  1062. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Module/Install/WriteAll.pm +0 -63
  1063. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Spiffy.pm +0 -539
  1064. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base.pm +0 -682
  1065. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Base/Filter.pm +0 -341
  1066. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder.pm +0 -1413
  1067. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/Builder/Module.pm +0 -81
  1068. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/inc/Test/More.pm +0 -735
  1069. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx.pm +0 -315
  1070. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/LWP.pm +0 -524
  1071. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Socket.pm +0 -1749
  1072. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/lib/Test/Nginx/Util.pm +0 -874
  1073. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs.t +0 -136
  1074. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_capture.t +0 -32
  1075. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_fix_string.t +0 -32
  1076. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_regex.t +0 -108
  1077. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/t/subs_types.t +0 -59
  1078. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/test/test.sh +0 -5
  1079. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/update-readme.sh +0 -7
  1080. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2google_code_homepage.pl +0 -29
  1081. data/packaging/debian/debian_specs/nginx/modules/ngx_http_substitutions_filter_module/util/wiki2pod.pl +0 -129
  1082. data/packaging/debian/debian_specs/nginx/nginx-common.NEWS +0 -135
  1083. data/packaging/debian/debian_specs/nginx/nginx-common.README.Debian +0 -45
  1084. data/packaging/debian/debian_specs/nginx/nginx-common.dirs.erb +0 -32
  1085. data/packaging/debian/debian_specs/nginx/nginx-common.install +0 -3
  1086. data/packaging/debian/debian_specs/nginx/nginx-common.lintian-overrides +0 -2
  1087. data/packaging/debian/debian_specs/nginx/nginx-common.manpages +0 -1
  1088. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.default +0 -10
  1089. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.init.erb +0 -214
  1090. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.logrotate +0 -18
  1091. data/packaging/debian/debian_specs/nginx/nginx-common.nginx.service.erb +0 -37
  1092. data/packaging/debian/debian_specs/nginx/nginx-common.postinst.erb +0 -66
  1093. data/packaging/debian/debian_specs/nginx/nginx-common.postrm.erb +0 -46
  1094. data/packaging/debian/debian_specs/nginx/nginx-common.preinst +0 -47
  1095. data/packaging/debian/debian_specs/nginx/nginx-common.prerm.erb +0 -28
  1096. data/packaging/debian/debian_specs/nginx/nginx-doc.docs +0 -2
  1097. data/packaging/debian/debian_specs/nginx/nginx-doc.examples +0 -1
  1098. data/packaging/debian/debian_specs/nginx/nginx-extras.install.erb +0 -17
  1099. data/packaging/debian/debian_specs/nginx/nginx-extras.lintian-overrides +0 -1
  1100. data/packaging/debian/debian_specs/nginx/nginx-extras.postinst.erb +0 -44
  1101. data/packaging/debian/debian_specs/nginx/nginx-extras.prerm +0 -22
  1102. data/packaging/debian/debian_specs/nginx/nginx.1 +0 -47
  1103. data/packaging/debian/debian_specs/nginx/patches/perl-use-dpkg-buildflags.patch +0 -23
  1104. data/packaging/debian/debian_specs/nginx/patches/series +0 -1
  1105. data/packaging/debian/debian_specs/nginx/rules.erb +0 -185
  1106. data/packaging/debian/debian_specs/nginx/source/format +0 -1
  1107. data/packaging/debian/debian_specs/nginx/tests/control +0 -4
  1108. data/packaging/debian/debian_specs/nginx/ufw/nginx +0 -14
  1109. data/packaging/debian/debian_specs/nginx/upstream/signing-key.asc +0 -34
  1110. data/packaging/debian/debian_specs/nginx/watch +0 -3
  1111. data/packaging/debian/debian_specs/passenger/README.Debian +0 -12
  1112. data/packaging/debian/debian_specs/passenger/changelog +0 -316
  1113. data/packaging/debian/debian_specs/passenger/compat +0 -1
  1114. data/packaging/debian/debian_specs/passenger/control.erb +0 -123
  1115. data/packaging/debian/debian_specs/passenger/copyright +0 -385
  1116. data/packaging/debian/debian_specs/passenger/helpers.rb +0 -24
  1117. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.install +0 -3
  1118. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.postinst +0 -36
  1119. data/packaging/debian/debian_specs/passenger/libapache2-mod-passenger.prerm +0 -15
  1120. data/packaging/debian/debian_specs/passenger/locations.ini.erb +0 -14
  1121. data/packaging/debian/debian_specs/passenger/passenger-dev.install.erb +0 -3
  1122. data/packaging/debian/debian_specs/passenger/passenger-doc.install.erb +0 -2
  1123. data/packaging/debian/debian_specs/passenger/passenger.conf +0 -6
  1124. data/packaging/debian/debian_specs/passenger/passenger.docs +0 -4
  1125. data/packaging/debian/debian_specs/passenger/passenger.install.erb +0 -16
  1126. data/packaging/debian/debian_specs/passenger/passenger.load +0 -3
  1127. data/packaging/debian/debian_specs/passenger/passenger.manpages +0 -3
  1128. data/packaging/debian/debian_specs/passenger/passenger_free_ruby.c +0 -29
  1129. data/packaging/debian/debian_specs/passenger/passenger_ruby_utils.c +0 -54
  1130. data/packaging/debian/debian_specs/passenger/passenger_system_ruby.c.erb +0 -37
  1131. data/packaging/debian/debian_specs/passenger/rules.erb +0 -84
  1132. data/packaging/debian/debian_specs/passenger/source/format +0 -1
  1133. data/packaging/debian/debian_specs/passenger_enterprise/README.Debian +0 -12
  1134. data/packaging/debian/debian_specs/passenger_enterprise/changelog +0 -316
  1135. data/packaging/debian/debian_specs/passenger_enterprise/compat +0 -1
  1136. data/packaging/debian/debian_specs/passenger_enterprise/control.erb +0 -123
  1137. data/packaging/debian/debian_specs/passenger_enterprise/copyright +0 -385
  1138. data/packaging/debian/debian_specs/passenger_enterprise/helpers.rb +0 -2
  1139. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.install +0 -3
  1140. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.postinst +0 -36
  1141. data/packaging/debian/debian_specs/passenger_enterprise/libapache2-mod-passenger-enterprise.prerm +0 -15
  1142. data/packaging/debian/debian_specs/passenger_enterprise/locations.ini.erb +0 -14
  1143. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-dev.install.erb +0 -3
  1144. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise-doc.install.erb +0 -2
  1145. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.docs +0 -4
  1146. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.install.erb +0 -14
  1147. data/packaging/debian/debian_specs/passenger_enterprise/passenger-enterprise.manpages +0 -3
  1148. data/packaging/debian/debian_specs/passenger_enterprise/passenger.conf +0 -6
  1149. data/packaging/debian/debian_specs/passenger_enterprise/passenger.load +0 -3
  1150. data/packaging/debian/debian_specs/passenger_enterprise/passenger_free_ruby.c.erb +0 -1
  1151. data/packaging/debian/debian_specs/passenger_enterprise/passenger_ruby_utils.c.erb +0 -1
  1152. data/packaging/debian/debian_specs/passenger_enterprise/passenger_system_ruby.c.erb +0 -1
  1153. data/packaging/debian/debian_specs/passenger_enterprise/patches/series +0 -0
  1154. data/packaging/debian/debian_specs/passenger_enterprise/rules.erb +0 -84
  1155. data/packaging/debian/debian_specs/passenger_enterprise/source/format +0 -1
  1156. data/packaging/debian/docker_images/Makefile +0 -38
  1157. data/packaging/debian/docker_images/buildbox/CONTAINER_VERSION.txt +0 -0
  1158. data/packaging/debian/docker_images/buildbox/Dockerfile +0 -3
  1159. data/packaging/debian/docker_images/buildbox/Gemfile +0 -9
  1160. data/packaging/debian/docker_images/buildbox/Gemfile.lock +0 -42
  1161. data/packaging/debian/docker_images/buildbox/install.sh +0 -85
  1162. data/packaging/debian/docker_images/buildbox/pbuilderrc +0 -4
  1163. data/packaging/debian/docker_images/buildbox/sudoers.conf +0 -6
  1164. data/packaging/debian/docker_images/setup-buildbox-docker-image +0 -7
  1165. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-6 +0 -7
  1166. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-7 +0 -7
  1167. data/packaging/debian/docker_images/setup-testbox-docker-image-debian-8 +0 -7
  1168. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-12.04 +0 -7
  1169. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-14.04 +0 -7
  1170. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.04 +0 -7
  1171. data/packaging/debian/docker_images/setup-testbox-docker-image-ubuntu-15.10 +0 -7
  1172. data/packaging/debian/docker_images/testbox-debian-6/Dockerfile +0 -3
  1173. data/packaging/debian/docker_images/testbox-debian-6/Gemfile +0 -2
  1174. data/packaging/debian/docker_images/testbox-debian-6/Gemfile.lock +0 -23
  1175. data/packaging/debian/docker_images/testbox-debian-6/argparse.py +0 -2374
  1176. data/packaging/debian/docker_images/testbox-debian-6/install.sh +0 -78
  1177. data/packaging/debian/docker_images/testbox-debian-7/Dockerfile +0 -3
  1178. data/packaging/debian/docker_images/testbox-debian-7/Gemfile +0 -2
  1179. data/packaging/debian/docker_images/testbox-debian-7/Gemfile.lock +0 -23
  1180. data/packaging/debian/docker_images/testbox-debian-7/install.sh +0 -71
  1181. data/packaging/debian/docker_images/testbox-debian-8/Dockerfile +0 -3
  1182. data/packaging/debian/docker_images/testbox-debian-8/Gemfile +0 -2
  1183. data/packaging/debian/docker_images/testbox-debian-8/Gemfile.lock +0 -23
  1184. data/packaging/debian/docker_images/testbox-debian-8/install.sh +0 -70
  1185. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Dockerfile +0 -3
  1186. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile +0 -2
  1187. data/packaging/debian/docker_images/testbox-ubuntu-12.04/Gemfile.lock +0 -23
  1188. data/packaging/debian/docker_images/testbox-ubuntu-12.04/install.sh +0 -69
  1189. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Dockerfile +0 -3
  1190. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile +0 -2
  1191. data/packaging/debian/docker_images/testbox-ubuntu-14.04/Gemfile.lock +0 -23
  1192. data/packaging/debian/docker_images/testbox-ubuntu-14.04/install.sh +0 -69
  1193. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Dockerfile +0 -3
  1194. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile +0 -2
  1195. data/packaging/debian/docker_images/testbox-ubuntu-15.04/Gemfile.lock +0 -23
  1196. data/packaging/debian/docker_images/testbox-ubuntu-15.04/install.sh +0 -69
  1197. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Dockerfile +0 -3
  1198. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile +0 -2
  1199. data/packaging/debian/docker_images/testbox-ubuntu-15.10/Gemfile.lock +0 -23
  1200. data/packaging/debian/docker_images/testbox-ubuntu-15.10/install.sh +0 -69
  1201. data/packaging/debian/internal/build/Rakefile +0 -235
  1202. data/packaging/debian/internal/build/build-passenger-orig-tarball.sh +0 -76
  1203. data/packaging/debian/internal/build/build-source-package.rb +0 -121
  1204. data/packaging/debian/internal/build/download-nginx-orig-tarball.sh +0 -17
  1205. data/packaging/debian/internal/build/rakefile_support.rb +0 -96
  1206. data/packaging/debian/internal/build/setup-environment-essentials.sh +0 -15
  1207. data/packaging/debian/internal/build/setup-environment.sh +0 -29
  1208. data/packaging/debian/internal/lib/distro_info.rb +0 -82
  1209. data/packaging/debian/internal/lib/distro_info.sh +0 -303
  1210. data/packaging/debian/internal/lib/distro_info.sh.erb +0 -65
  1211. data/packaging/debian/internal/lib/library.sh +0 -83
  1212. data/packaging/debian/internal/lib/preprocessor.rb +0 -173
  1213. data/packaging/debian/internal/lib/tracking.rb +0 -95
  1214. data/packaging/debian/internal/lib/tracking_category.rb +0 -45
  1215. data/packaging/debian/internal/lib/tracking_database.rb +0 -132
  1216. data/packaging/debian/internal/lib/tracking_task.rb +0 -148
  1217. data/packaging/debian/internal/lib/utils.rb +0 -78
  1218. data/packaging/debian/internal/publish/Rakefile +0 -97
  1219. data/packaging/debian/internal/publish/oss-binaries.phusionpassenger.com-fingerprint.txt +0 -1
  1220. data/packaging/debian/internal/publish/packagecloud_fingerprint.txt +0 -1
  1221. data/packaging/debian/internal/publish/passenger_website_fingerprint.txt +0 -1
  1222. data/packaging/debian/internal/publish/preinit.sh +0 -7
  1223. data/packaging/debian/internal/publish/rakefile_support.rb +0 -183
  1224. data/packaging/debian/internal/scripts/gpg_noninteractive/gpg +0 -11
  1225. data/packaging/debian/internal/scripts/initccache.sh +0 -35
  1226. data/packaging/debian/internal/scripts/inituidgid.sh +0 -19
  1227. data/packaging/debian/internal/scripts/my_init +0 -340
  1228. data/packaging/debian/internal/scripts/pin_certificates +0 -34
  1229. data/packaging/debian/internal/scripts/regen_distro_info_script.sh +0 -3
  1230. data/packaging/debian/internal/scripts/setup-vagrant.sh +0 -12
  1231. data/packaging/debian/internal/scripts/setuser +0 -31
  1232. data/packaging/debian/internal/shell/initpbuilder.sh +0 -3
  1233. data/packaging/debian/internal/shell/preinit.sh +0 -28
  1234. data/packaging/debian/internal/shell/sudoers.conf +0 -1
  1235. data/packaging/debian/internal/test/apache/apache-24.conf +0 -5
  1236. data/packaging/debian/internal/test/apache/apache-pre-24.conf +0 -4
  1237. data/packaging/debian/internal/test/apache/vhost.conf +0 -17
  1238. data/packaging/debian/internal/test/misc/config.json +0 -15
  1239. data/packaging/debian/internal/test/misc/hosts.conf +0 -4
  1240. data/packaging/debian/internal/test/misc/init.sh +0 -25
  1241. data/packaging/debian/internal/test/misc/nodejs_test_app.js +0 -6
  1242. data/packaging/debian/internal/test/misc/python_test_app.py +0 -3
  1243. data/packaging/debian/internal/test/misc/ruby_test_app.rb +0 -5
  1244. data/packaging/debian/internal/test/misc/test_support.rb +0 -61
  1245. data/packaging/debian/internal/test/nginx/vhost.conf +0 -23
  1246. data/packaging/debian/internal/test/system_web_server_test.rb +0 -126
  1247. data/packaging/debian/internal/test/test.sh +0 -141
  1248. data/packaging/debian/jenkins/publish/clear_caches.rb +0 -48
  1249. data/packaging/debian/jenkins/publish/publish.sh +0 -69
  1250. data/packaging/debian/jenkins/test/test.sh +0 -63
  1251. data/packaging/debian/passenger_apt_automation.sublime-project +0 -14
  1252. data/packaging/debian/publish +0 -172
  1253. data/packaging/debian/shell +0 -116
  1254. data/packaging/debian/test +0 -142
  1255. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-gcc47-include-sys_types.patch +0 -45
  1256. data/test/cxx/Base64Test.cpp +0 -50
  1257. data/test/cxx/FileBackedPipeTest.cpp +0 -626
  1258. data/test/cxx/HttpHeaderBuffererTest.cpp +0 -257
  1259. data/test/cxx/ScgiRequestParserTest.cpp +0 -423
  1260. data/test/cxx/ServerInstanceDirTest.cpp +0 -175
  1261. data/test/ruby/admin_tools_spec.rb +0 -360
  1262. data/test/ruby/classic_rails/loader_spec.rb +0 -46
  1263. data/test/ruby/classic_rails/preloader_spec.rb +0 -52
  1264. data/test/ruby/standalone/runtime_locator_spec.rb +0 -214
  1265. data/test/stub/rails2.3/Rakefile +0 -10
  1266. data/test/stub/rails2.3/app/controllers/application_controller.rb +0 -10
  1267. data/test/stub/rails2.3/app/controllers/bar_controller_1.rb +0 -5
  1268. data/test/stub/rails2.3/app/controllers/bar_controller_2.rb +0 -5
  1269. data/test/stub/rails2.3/app/controllers/foo_controller.rb +0 -21
  1270. data/test/stub/rails2.3/app/helpers/application_helper.rb +0 -3
  1271. data/test/stub/rails2.3/app/helpers/bar_helper.rb +0 -2
  1272. data/test/stub/rails2.3/app/helpers/foo_helper.rb +0 -2
  1273. data/test/stub/rails2.3/config/boot.rb +0 -110
  1274. data/test/stub/rails2.3/config/database.yml +0 -19
  1275. data/test/stub/rails2.3/config/environment.rb +0 -62
  1276. data/test/stub/rails2.3/config/environments/development.rb +0 -17
  1277. data/test/stub/rails2.3/config/environments/production.rb +0 -18
  1278. data/test/stub/rails2.3/config/environments/staging.rb +0 -18
  1279. data/test/stub/rails2.3/config/initializers/inflections.rb +0 -10
  1280. data/test/stub/rails2.3/config/initializers/mime_types.rb +0 -5
  1281. data/test/stub/rails2.3/config/routes.rb +0 -35
  1282. data/test/stub/rails2.3/log/.gitignore +0 -1
  1283. data/test/stub/rails2.3/public/.gitignore +0 -1
  1284. data/test/stub/rails2.3/script/about +0 -3
  1285. data/test/stub/rails2.3/script/console +0 -3
  1286. data/test/stub/rails2.3/script/dbconsole +0 -3
  1287. data/test/stub/rails2.3/script/destroy +0 -3
  1288. data/test/stub/rails2.3/script/generate +0 -3
  1289. data/test/stub/rails2.3/script/performance/benchmarker +0 -3
  1290. data/test/stub/rails2.3/script/performance/profiler +0 -3
  1291. data/test/stub/rails2.3/script/performance/request +0 -3
  1292. data/test/stub/rails2.3/script/plugin +0 -3
  1293. data/test/stub/rails2.3/script/process/inspector +0 -3
  1294. data/test/stub/rails2.3/script/process/reaper +0 -3
  1295. data/test/stub/rails2.3/script/process/spawner +0 -3
  1296. data/test/stub/rails2.3/script/runner +0 -3
  1297. data/test/stub/rails2.3/script/server +0 -3
  1298. data/test/stub/rails2.3/tmp/cache/.gitignore +0 -1
  1299. data/test/stub/rails2.3/tmp/pids/.gitignore +0 -1
  1300. data/test/stub/rails2.3/tmp/sessions/.gitignore +0 -1
  1301. data/test/stub/rails2.3/tmp/sockets/.gitignore +0 -1
@@ -0,0 +1,2856 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
4
+ // Software License, Version 1.0. (See accompanying file
5
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
+ //
7
+ // See http://www.boost.org/libs/container for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+ // Copyright (c) 1996,1997
11
+ // Silicon Graphics Computer Systems, Inc.
12
+ //
13
+ // Permission to use, copy, modify, distribute and sell this software
14
+ // and its documentation for any purpose is hereby granted without fee,
15
+ // provided that the above copyright notice appear in all copies and
16
+ // that both that copyright notice and this permission notice appear
17
+ // in supporting documentation. Silicon Graphics makes no
18
+ // representations about the suitability of this software for any
19
+ // purpose. It is provided "as is" without express or implied warranty.
20
+ //
21
+ //
22
+ // Copyright (c) 1994
23
+ // Hewlett-Packard Company
24
+ //
25
+ // Permission to use, copy, modify, distribute and sell this software
26
+ // and its documentation for any purpose is hereby granted without fee,
27
+ // provided that the above copyright notice appear in all copies and
28
+ // that both that copyright notice and this permission notice appear
29
+ // in supporting documentation. Hewlett-Packard Company makes no
30
+ // representations about the suitability of this software for any
31
+ // purpose. It is provided "as is" without express or implied warranty.
32
+
33
+ #ifndef BOOST_CONTAINER_STRING_HPP
34
+ #define BOOST_CONTAINER_STRING_HPP
35
+
36
+ #include <boost/container/detail/config_begin.hpp>
37
+ #include <boost/container/detail/workaround.hpp>
38
+
39
+ #include <boost/container/detail/workaround.hpp>
40
+ #include <boost/container/container_fwd.hpp>
41
+ #include <boost/container/throw_exception.hpp>
42
+ #include <boost/container/detail/utilities.hpp>
43
+ #include <boost/container/detail/iterators.hpp>
44
+ #include <boost/container/detail/algorithms.hpp>
45
+ #include <boost/container/detail/version_type.hpp>
46
+ #include <boost/container/detail/allocation_type.hpp>
47
+ #include <boost/container/allocator_traits.hpp>
48
+ #include <boost/container/detail/allocator_version_traits.hpp>
49
+ #include <boost/container/detail/mpl.hpp>
50
+ #include <boost/move/utility.hpp>
51
+ #include <boost/static_assert.hpp>
52
+ #include <boost/functional/hash.hpp>
53
+ #include <boost/intrusive/pointer_traits.hpp>
54
+ #include <boost/detail/no_exceptions_support.hpp>
55
+
56
+ #include <functional>
57
+ #include <string>
58
+ #include <utility>
59
+ #include <iterator>
60
+ #include <memory>
61
+ #include <algorithm>
62
+ #include <iosfwd>
63
+ #include <istream>
64
+ #include <ostream>
65
+ #include <ios>
66
+ #include <locale>
67
+ #include <cstddef>
68
+ #include <climits>
69
+ #include <boost/container/detail/type_traits.hpp>
70
+ #include <boost/detail/no_exceptions_support.hpp>
71
+ #include <boost/type_traits/has_trivial_destructor.hpp>
72
+ #include <boost/aligned_storage.hpp>
73
+
74
+ namespace boost {
75
+ namespace container {
76
+
77
+ /// @cond
78
+ namespace container_detail {
79
+ // ------------------------------------------------------------
80
+ // Class basic_string_base.
81
+
82
+ // basic_string_base is a helper class that makes it it easier to write
83
+ // an exception-safe version of basic_string. The constructor allocates,
84
+ // but does not initialize, a block of memory. The destructor
85
+ // deallocates, but does not destroy elements within, a block of
86
+ // memory. The destructor assumes that the memory either is the internal buffer,
87
+ // or else points to a block of memory that was allocated using string_base's
88
+ // allocator and whose size is this->m_storage.
89
+ template <class Allocator>
90
+ class basic_string_base
91
+ {
92
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_string_base)
93
+
94
+ typedef allocator_traits<Allocator> allocator_traits_type;
95
+ public:
96
+ typedef Allocator allocator_type;
97
+ typedef allocator_type stored_allocator_type;
98
+ typedef typename allocator_traits_type::pointer pointer;
99
+ typedef typename allocator_traits_type::value_type value_type;
100
+ typedef typename allocator_traits_type::size_type size_type;
101
+ typedef ::boost::intrusive::pointer_traits<pointer> pointer_traits;
102
+
103
+ basic_string_base()
104
+ : members_()
105
+ { init(); }
106
+
107
+ basic_string_base(const allocator_type& a)
108
+ : members_(a)
109
+ { init(); }
110
+
111
+ basic_string_base(const allocator_type& a, size_type n)
112
+ : members_(a)
113
+ {
114
+ this->init();
115
+ this->allocate_initial_block(n);
116
+ }
117
+
118
+ basic_string_base(BOOST_RV_REF(basic_string_base) b)
119
+ : members_(boost::move(b.alloc()))
120
+ {
121
+ this->init();
122
+ this->swap_data(b);
123
+ }
124
+
125
+ ~basic_string_base()
126
+ {
127
+ if(!this->is_short()){
128
+ this->deallocate_block();
129
+ this->is_short(true);
130
+ }
131
+ }
132
+
133
+ private:
134
+
135
+ //This is the structure controlling a long string
136
+ struct long_t
137
+ {
138
+ size_type is_short : 1;
139
+ size_type length : (sizeof(size_type)*CHAR_BIT - 1);
140
+ size_type storage;
141
+ pointer start;
142
+
143
+ long_t()
144
+ {}
145
+
146
+ long_t(const long_t &other)
147
+ {
148
+ this->is_short = other.is_short;
149
+ length = other.length;
150
+ storage = other.storage;
151
+ start = other.start;
152
+ }
153
+
154
+ long_t &operator =(const long_t &other)
155
+ {
156
+ this->is_short = other.is_short;
157
+ length = other.length;
158
+ storage = other.storage;
159
+ start = other.start;
160
+ return *this;
161
+ }
162
+ };
163
+
164
+ //This type is the first part of the structure controlling a short string
165
+ //The "data" member stores
166
+ struct short_header
167
+ {
168
+ unsigned char is_short : 1;
169
+ unsigned char length : (CHAR_BIT - 1);
170
+ };
171
+
172
+ //This type has the same alignment and size as long_t but it's POD
173
+ //so, unlike long_t, it can be placed in a union
174
+
175
+ typedef typename boost::aligned_storage< sizeof(long_t),
176
+ container_detail::alignment_of<long_t>::value>::type long_raw_t;
177
+
178
+ protected:
179
+ static const size_type MinInternalBufferChars = 8;
180
+ static const size_type AlignmentOfValueType =
181
+ alignment_of<value_type>::value;
182
+ static const size_type ShortDataOffset =
183
+ container_detail::ct_rounded_size<sizeof(short_header), AlignmentOfValueType>::value;
184
+ static const size_type ZeroCostInternalBufferChars =
185
+ (sizeof(long_t) - ShortDataOffset)/sizeof(value_type);
186
+ static const size_type UnalignedFinalInternalBufferChars =
187
+ (ZeroCostInternalBufferChars > MinInternalBufferChars) ?
188
+ ZeroCostInternalBufferChars : MinInternalBufferChars;
189
+
190
+ struct short_t
191
+ {
192
+ short_header h;
193
+ value_type data[UnalignedFinalInternalBufferChars];
194
+ };
195
+
196
+ union repr_t
197
+ {
198
+ long_raw_t r;
199
+ short_t s;
200
+
201
+ const short_t &short_repr() const
202
+ { return s; }
203
+
204
+ const long_t &long_repr() const
205
+ { return *static_cast<const long_t*>(static_cast<const void*>(&r)); }
206
+
207
+ short_t &short_repr()
208
+ { return s; }
209
+
210
+ long_t &long_repr()
211
+ { return *static_cast<long_t*>(static_cast<void*>(&r)); }
212
+ };
213
+
214
+ struct members_holder
215
+ : public Allocator
216
+ {
217
+ members_holder()
218
+ : Allocator()
219
+ {}
220
+
221
+ template<class AllocatorConvertible>
222
+ explicit members_holder(BOOST_FWD_REF(AllocatorConvertible) a)
223
+ : Allocator(boost::forward<AllocatorConvertible>(a))
224
+ {}
225
+
226
+ repr_t m_repr;
227
+ } members_;
228
+
229
+ const Allocator &alloc() const
230
+ { return members_; }
231
+
232
+ Allocator &alloc()
233
+ { return members_; }
234
+
235
+ static const size_type InternalBufferChars = (sizeof(repr_t) - ShortDataOffset)/sizeof(value_type);
236
+
237
+ private:
238
+
239
+ static const size_type MinAllocation = InternalBufferChars*2;
240
+
241
+ protected:
242
+ bool is_short() const
243
+ { return static_cast<bool>(this->members_.m_repr.s.h.is_short != 0); }
244
+
245
+ void is_short(bool yes)
246
+ {
247
+ const bool was_short = this->is_short();
248
+ if(yes && !was_short){
249
+ allocator_traits_type::destroy
250
+ ( this->alloc()
251
+ , static_cast<long_t*>(static_cast<void*>(&this->members_.m_repr.r))
252
+ );
253
+ this->members_.m_repr.s.h.is_short = true;
254
+ }
255
+ else if(!yes && was_short){
256
+ allocator_traits_type::construct
257
+ ( this->alloc()
258
+ , static_cast<long_t*>(static_cast<void*>(&this->members_.m_repr.r))
259
+ );
260
+ this->members_.m_repr.s.h.is_short = false;
261
+ }
262
+ }
263
+
264
+ private:
265
+ void init()
266
+ {
267
+ this->members_.m_repr.s.h.is_short = 1;
268
+ this->members_.m_repr.s.h.length = 0;
269
+ }
270
+
271
+ protected:
272
+
273
+ typedef container_detail::integral_constant<unsigned, 1> allocator_v1;
274
+ typedef container_detail::integral_constant<unsigned, 2> allocator_v2;
275
+ typedef container_detail::integral_constant<unsigned,
276
+ boost::container::container_detail::version<Allocator>::value> alloc_version;
277
+
278
+ std::pair<pointer, bool>
279
+ allocation_command(allocation_type command,
280
+ size_type limit_size,
281
+ size_type preferred_size,
282
+ size_type &received_size, pointer reuse = 0)
283
+ {
284
+ if(this->is_short() && (command & (expand_fwd | expand_bwd)) ){
285
+ reuse = pointer();
286
+ command &= ~(expand_fwd | expand_bwd);
287
+ }
288
+ return container_detail::allocator_version_traits<Allocator>::allocation_command
289
+ (this->alloc(), command, limit_size, preferred_size, received_size, reuse);
290
+ }
291
+
292
+ size_type next_capacity(size_type additional_objects) const
293
+ { return get_next_capacity(allocator_traits_type::max_size(this->alloc()), this->priv_storage(), additional_objects); }
294
+
295
+ void deallocate(pointer p, size_type n)
296
+ {
297
+ if (p && (n > InternalBufferChars))
298
+ this->alloc().deallocate(p, n);
299
+ }
300
+
301
+ void construct(pointer p, const value_type &value = value_type())
302
+ {
303
+ allocator_traits_type::construct
304
+ ( this->alloc()
305
+ , container_detail::to_raw_pointer(p)
306
+ , value
307
+ );
308
+ }
309
+
310
+ void destroy(pointer p, size_type n)
311
+ {
312
+ value_type *raw_p = container_detail::to_raw_pointer(p);
313
+ for(; n--; ++raw_p){
314
+ allocator_traits_type::destroy( this->alloc(), raw_p);
315
+ }
316
+ }
317
+
318
+ void destroy(pointer p)
319
+ {
320
+ allocator_traits_type::destroy
321
+ ( this->alloc()
322
+ , container_detail::to_raw_pointer(p)
323
+ );
324
+ }
325
+
326
+ void allocate_initial_block(size_type n)
327
+ {
328
+ if (n <= this->max_size()) {
329
+ if(n > InternalBufferChars){
330
+ size_type new_cap = this->next_capacity(n);
331
+ pointer p = this->allocation_command(allocate_new, n, new_cap, new_cap).first;
332
+ this->is_short(false);
333
+ this->priv_long_addr(p);
334
+ this->priv_long_size(0);
335
+ this->priv_storage(new_cap);
336
+ }
337
+ }
338
+ else{
339
+ throw_length_error("basic_string::allocate_initial_block max_size() exceeded");
340
+ }
341
+ }
342
+
343
+ void deallocate_block()
344
+ { this->deallocate(this->priv_addr(), this->priv_storage()); }
345
+
346
+ size_type max_size() const
347
+ { return allocator_traits_type::max_size(this->alloc()) - 1; }
348
+
349
+ protected:
350
+ size_type priv_capacity() const
351
+ { return this->priv_storage() - 1; }
352
+
353
+ pointer priv_short_addr() const
354
+ { return pointer_traits::pointer_to(const_cast<value_type&>(this->members_.m_repr.short_repr().data[0])); }
355
+
356
+ pointer priv_long_addr() const
357
+ { return this->members_.m_repr.long_repr().start; }
358
+
359
+ pointer priv_addr() const
360
+ {
361
+ return this->is_short()
362
+ ? priv_short_addr()
363
+ : priv_long_addr()
364
+ ;
365
+ }
366
+
367
+ pointer priv_end_addr() const
368
+ {
369
+ return this->is_short()
370
+ ? this->priv_short_addr() + this->priv_short_size()
371
+ : this->priv_long_addr() + this->priv_long_size()
372
+ ;
373
+ }
374
+
375
+ void priv_long_addr(pointer addr)
376
+ { this->members_.m_repr.long_repr().start = addr; }
377
+
378
+ size_type priv_storage() const
379
+ { return this->is_short() ? priv_short_storage() : priv_long_storage(); }
380
+
381
+ size_type priv_short_storage() const
382
+ { return InternalBufferChars; }
383
+
384
+ size_type priv_long_storage() const
385
+ { return this->members_.m_repr.long_repr().storage; }
386
+
387
+ void priv_storage(size_type storage)
388
+ {
389
+ if(!this->is_short())
390
+ this->priv_long_storage(storage);
391
+ }
392
+
393
+ void priv_long_storage(size_type storage)
394
+ {
395
+ this->members_.m_repr.long_repr().storage = storage;
396
+ }
397
+
398
+ size_type priv_size() const
399
+ { return this->is_short() ? this->priv_short_size() : this->priv_long_size(); }
400
+
401
+ size_type priv_short_size() const
402
+ { return this->members_.m_repr.short_repr().h.length; }
403
+
404
+ size_type priv_long_size() const
405
+ { return this->members_.m_repr.long_repr().length; }
406
+
407
+ void priv_size(size_type sz)
408
+ {
409
+ if(this->is_short())
410
+ this->priv_short_size(sz);
411
+ else
412
+ this->priv_long_size(sz);
413
+ }
414
+
415
+ void priv_short_size(size_type sz)
416
+ {
417
+ this->members_.m_repr.s.h.length = (unsigned char)sz;
418
+ }
419
+
420
+ void priv_long_size(size_type sz)
421
+ {
422
+ this->members_.m_repr.long_repr().length = sz;
423
+ }
424
+
425
+ void swap_data(basic_string_base& other)
426
+ {
427
+ if(this->is_short()){
428
+ if(other.is_short()){
429
+ std::swap(this->members_.m_repr, other.members_.m_repr);
430
+ }
431
+ else{
432
+ short_t short_backup(this->members_.m_repr.short_repr());
433
+ long_t long_backup (other.members_.m_repr.long_repr());
434
+ other.members_.m_repr.long_repr().~long_t();
435
+ ::new(&this->members_.m_repr.long_repr()) long_t;
436
+ this->members_.m_repr.long_repr() = long_backup;
437
+ other.members_.m_repr.short_repr() = short_backup;
438
+ }
439
+ }
440
+ else{
441
+ if(other.is_short()){
442
+ short_t short_backup(other.members_.m_repr.short_repr());
443
+ long_t long_backup (this->members_.m_repr.long_repr());
444
+ this->members_.m_repr.long_repr().~long_t();
445
+ ::new(&other.members_.m_repr.long_repr()) long_t;
446
+ other.members_.m_repr.long_repr() = long_backup;
447
+ this->members_.m_repr.short_repr() = short_backup;
448
+ }
449
+ else{
450
+ boost::container::swap_dispatch(this->members_.m_repr.long_repr(), other.members_.m_repr.long_repr());
451
+ }
452
+ }
453
+ }
454
+ };
455
+
456
+ } //namespace container_detail {
457
+
458
+ /// @endcond
459
+
460
+ //! The basic_string class represents a Sequence of characters. It contains all the
461
+ //! usual operations of a Sequence, and, additionally, it contains standard string
462
+ //! operations such as search and concatenation.
463
+ //!
464
+ //! The basic_string class is parameterized by character type, and by that type's
465
+ //! Character Traits.
466
+ //!
467
+ //! This class has performance characteristics very much like vector<>, meaning,
468
+ //! for example, that it does not perform reference-count or copy-on-write, and that
469
+ //! concatenation of two strings is an O(N) operation.
470
+ //!
471
+ //! Some of basic_string's member functions use an unusual method of specifying positions
472
+ //! and ranges. In addition to the conventional method using iterators, many of
473
+ //! basic_string's member functions use a single value pos of type size_type to represent a
474
+ //! position (in which case the position is begin() + pos, and many of basic_string's
475
+ //! member functions use two values, pos and n, to represent a range. In that case pos is
476
+ //! the beginning of the range and n is its size. That is, the range is
477
+ //! [begin() + pos, begin() + pos + n).
478
+ //!
479
+ //! Note that the C++ standard does not specify the complexity of basic_string operations.
480
+ //! In this implementation, basic_string has performance characteristics very similar to
481
+ //! those of vector: access to a single character is O(1), while copy and concatenation
482
+ //! are O(N).
483
+ //!
484
+ //! In this implementation, begin(),
485
+ //! end(), rbegin(), rend(), operator[], c_str(), and data() do not invalidate iterators.
486
+ //! In this implementation, iterators are only invalidated by member functions that
487
+ //! explicitly change the string's contents.
488
+ #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
489
+ template <class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT> >
490
+ #else
491
+ template <class CharT, class Traits, class Allocator>
492
+ #endif
493
+ class basic_string
494
+ : private container_detail::basic_string_base<Allocator>
495
+ {
496
+ /// @cond
497
+ private:
498
+ typedef allocator_traits<Allocator> allocator_traits_type;
499
+ BOOST_COPYABLE_AND_MOVABLE(basic_string)
500
+ typedef container_detail::basic_string_base<Allocator> base_t;
501
+ static const typename base_t::size_type InternalBufferChars = base_t::InternalBufferChars;
502
+
503
+ protected:
504
+ // Allocator helper class to use a char_traits as a function object.
505
+
506
+ template <class Tr>
507
+ struct Eq_traits
508
+ : public std::binary_function<typename Tr::char_type,
509
+ typename Tr::char_type,
510
+ bool>
511
+ {
512
+ bool operator()(const typename Tr::char_type& x,
513
+ const typename Tr::char_type& y) const
514
+ { return Tr::eq(x, y); }
515
+ };
516
+
517
+ template <class Tr>
518
+ struct Not_within_traits
519
+ : public std::unary_function<typename Tr::char_type, bool>
520
+ {
521
+ typedef const typename Tr::char_type* Pointer;
522
+ const Pointer m_first;
523
+ const Pointer m_last;
524
+
525
+ Not_within_traits(Pointer f, Pointer l)
526
+ : m_first(f), m_last(l) {}
527
+
528
+ bool operator()(const typename Tr::char_type& x) const
529
+ {
530
+ return std::find_if(m_first, m_last,
531
+ std::bind1st(Eq_traits<Tr>(), x)) == m_last;
532
+ }
533
+ };
534
+ /// @endcond
535
+
536
+ public:
537
+ //////////////////////////////////////////////
538
+ //
539
+ // types
540
+ //
541
+ //////////////////////////////////////////////
542
+ typedef Traits traits_type;
543
+ typedef CharT value_type;
544
+ typedef typename ::boost::container::allocator_traits<Allocator>::pointer pointer;
545
+ typedef typename ::boost::container::allocator_traits<Allocator>::const_pointer const_pointer;
546
+ typedef typename ::boost::container::allocator_traits<Allocator>::reference reference;
547
+ typedef typename ::boost::container::allocator_traits<Allocator>::const_reference const_reference;
548
+ typedef typename ::boost::container::allocator_traits<Allocator>::size_type size_type;
549
+ typedef typename ::boost::container::allocator_traits<Allocator>::difference_type difference_type;
550
+ typedef Allocator allocator_type;
551
+ typedef BOOST_CONTAINER_IMPDEF(allocator_type) stored_allocator_type;
552
+ typedef BOOST_CONTAINER_IMPDEF(pointer) iterator;
553
+ typedef BOOST_CONTAINER_IMPDEF(const_pointer) const_iterator;
554
+ typedef BOOST_CONTAINER_IMPDEF(std::reverse_iterator<iterator>) reverse_iterator;
555
+ typedef BOOST_CONTAINER_IMPDEF(std::reverse_iterator<const_iterator>) const_reverse_iterator;
556
+ static const size_type npos = size_type(-1);
557
+
558
+ /// @cond
559
+ private:
560
+ typedef constant_iterator<CharT, difference_type> cvalue_iterator;
561
+ typedef typename base_t::allocator_v1 allocator_v1;
562
+ typedef typename base_t::allocator_v2 allocator_v2;
563
+ typedef typename base_t::alloc_version alloc_version;
564
+ typedef ::boost::intrusive::pointer_traits<pointer> pointer_traits;
565
+ /// @endcond
566
+
567
+ public: // Constructor, destructor, assignment.
568
+ //////////////////////////////////////////////
569
+ //
570
+ // construct/copy/destroy
571
+ //
572
+ //////////////////////////////////////////////
573
+ /// @cond
574
+ struct reserve_t {};
575
+
576
+ basic_string(reserve_t, size_type n,
577
+ const allocator_type& a = allocator_type())
578
+ //Select allocator as in copy constructor as reserve_t-based constructors
579
+ //are two step copies optimized for capacity
580
+ : base_t( allocator_traits_type::select_on_container_copy_construction(a)
581
+ , n + 1)
582
+ { this->priv_terminate_string(); }
583
+
584
+ /// @endcond
585
+
586
+ //! <b>Effects</b>: Default constructs a basic_string.
587
+ //!
588
+ //! <b>Throws</b>: If allocator_type's default constructor throws.
589
+ basic_string()
590
+ : base_t()
591
+ { this->priv_terminate_string(); }
592
+
593
+
594
+ //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter.
595
+ //!
596
+ //! <b>Throws</b>: Nothing
597
+ explicit basic_string(const allocator_type& a) BOOST_CONTAINER_NOEXCEPT
598
+ : base_t(a)
599
+ { this->priv_terminate_string(); }
600
+
601
+ //! <b>Effects</b>: Copy constructs a basic_string.
602
+ //!
603
+ //! <b>Postcondition</b>: x == *this.
604
+ //!
605
+ //! <b>Throws</b>: If allocator_type's default constructor throws.
606
+ basic_string(const basic_string& s)
607
+ : base_t(allocator_traits_type::select_on_container_copy_construction(s.alloc()))
608
+ {
609
+ this->priv_terminate_string();
610
+ this->assign(s.begin(), s.end());
611
+ }
612
+
613
+ //! <b>Effects</b>: Move constructor. Moves s's resources to *this.
614
+ //!
615
+ //! <b>Throws</b>: Nothing.
616
+ //!
617
+ //! <b>Complexity</b>: Constant.
618
+ basic_string(BOOST_RV_REF(basic_string) s) BOOST_CONTAINER_NOEXCEPT
619
+ : base_t(boost::move((base_t&)s))
620
+ {}
621
+
622
+ //! <b>Effects</b>: Copy constructs a basic_string using the specified allocator.
623
+ //!
624
+ //! <b>Postcondition</b>: x == *this.
625
+ //!
626
+ //! <b>Throws</b>: If allocation throws.
627
+ basic_string(const basic_string& s, const allocator_type &a)
628
+ : base_t(a)
629
+ {
630
+ this->priv_terminate_string();
631
+ this->assign(s.begin(), s.end());
632
+ }
633
+
634
+ //! <b>Effects</b>: Move constructor using the specified allocator.
635
+ //! Moves s's resources to *this.
636
+ //!
637
+ //! <b>Throws</b>: If allocation throws.
638
+ //!
639
+ //! <b>Complexity</b>: Constant if a == s.get_allocator(), linear otherwise.
640
+ basic_string(BOOST_RV_REF(basic_string) s, const allocator_type &a)
641
+ : base_t(a)
642
+ {
643
+ this->priv_terminate_string();
644
+ if(a == this->alloc()){
645
+ this->swap_data(s);
646
+ }
647
+ else{
648
+ this->assign(s.begin(), s.end());
649
+ }
650
+ }
651
+
652
+ //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
653
+ //! and is initialized by a specific number of characters of the s string.
654
+ basic_string(const basic_string& s, size_type pos, size_type n = npos,
655
+ const allocator_type& a = allocator_type())
656
+ : base_t(a)
657
+ {
658
+ this->priv_terminate_string();
659
+ if (pos > s.size())
660
+ throw_out_of_range("basic_string::basic_string out of range position");
661
+ else
662
+ this->assign
663
+ (s.begin() + pos, s.begin() + pos + container_detail::min_value(n, s.size() - pos));
664
+ }
665
+
666
+ //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
667
+ //! and is initialized by a specific number of characters of the s c-string.
668
+ basic_string(const CharT* s, size_type n, const allocator_type& a = allocator_type())
669
+ : base_t(a)
670
+ {
671
+ this->priv_terminate_string();
672
+ this->assign(s, s + n);
673
+ }
674
+
675
+ //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
676
+ //! and is initialized by the null-terminated s c-string.
677
+ basic_string(const CharT* s, const allocator_type& a = allocator_type())
678
+ : base_t(a)
679
+ {
680
+ this->priv_terminate_string();
681
+ this->assign(s, s + Traits::length(s));
682
+ }
683
+
684
+ //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
685
+ //! and is initialized by n copies of c.
686
+ basic_string(size_type n, CharT c, const allocator_type& a = allocator_type())
687
+ : base_t(a)
688
+ {
689
+ this->priv_terminate_string();
690
+ this->assign(n, c);
691
+ }
692
+
693
+ //! <b>Effects</b>: Constructs a basic_string taking the allocator as parameter,
694
+ //! and a range of iterators.
695
+ template <class InputIterator>
696
+ basic_string(InputIterator f, InputIterator l, const allocator_type& a = allocator_type())
697
+ : base_t(a)
698
+ {
699
+ this->priv_terminate_string();
700
+ this->assign(f, l);
701
+ }
702
+
703
+ //! <b>Effects</b>: Destroys the basic_string. All used memory is deallocated.
704
+ //!
705
+ //! <b>Throws</b>: Nothing.
706
+ //!
707
+ //! <b>Complexity</b>: Constant.
708
+ ~basic_string() BOOST_CONTAINER_NOEXCEPT
709
+ {}
710
+
711
+ //! <b>Effects</b>: Copy constructs a string.
712
+ //!
713
+ //! <b>Postcondition</b>: x == *this.
714
+ //!
715
+ //! <b>Complexity</b>: Linear to the elements x contains.
716
+ basic_string& operator=(BOOST_COPY_ASSIGN_REF(basic_string) x)
717
+ {
718
+ if (&x != this){
719
+ allocator_type &this_alloc = this->alloc();
720
+ const allocator_type &x_alloc = x.alloc();
721
+ container_detail::bool_<allocator_traits_type::
722
+ propagate_on_container_copy_assignment::value> flag;
723
+ if(flag && this_alloc != x_alloc){
724
+ if(!this->is_short()){
725
+ this->deallocate_block();
726
+ this->is_short(true);
727
+ Traits::assign(*this->priv_addr(), CharT(0));
728
+ this->priv_short_size(0);
729
+ }
730
+ }
731
+ container_detail::assign_alloc(this->alloc(), x.alloc(), flag);
732
+ this->assign(x.begin(), x.end());
733
+ }
734
+ return *this;
735
+ }
736
+
737
+ //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
738
+ //!
739
+ //! <b>Throws</b>: If allocator_type's copy constructor throws.
740
+ //!
741
+ //! <b>Complexity</b>: Constant.
742
+ basic_string& operator=(BOOST_RV_REF(basic_string) x) BOOST_CONTAINER_NOEXCEPT
743
+ {
744
+ if (&x != this){
745
+ allocator_type &this_alloc = this->alloc();
746
+ allocator_type &x_alloc = x.alloc();
747
+ //If allocators are equal we can just swap pointers
748
+ if(this_alloc == x_alloc){
749
+ //Destroy objects but retain memory in case x reuses it in the future
750
+ this->clear();
751
+ this->swap_data(x);
752
+ //Move allocator if needed
753
+ container_detail::bool_<allocator_traits_type::
754
+ propagate_on_container_move_assignment::value> flag;
755
+ container_detail::move_alloc(this_alloc, x_alloc, flag);
756
+ }
757
+ //If unequal allocators, then do a one by one move
758
+ else{
759
+ this->assign( x.begin(), x.end());
760
+ }
761
+ }
762
+ return *this;
763
+ }
764
+
765
+ //! <b>Effects</b>: Assignment from a null-terminated c-string.
766
+ basic_string& operator=(const CharT* s)
767
+ { return this->assign(s, s + Traits::length(s)); }
768
+
769
+ //! <b>Effects</b>: Assignment from character.
770
+ basic_string& operator=(CharT c)
771
+ { return this->assign(static_cast<size_type>(1), c); }
772
+
773
+ //! <b>Effects</b>: Returns a copy of the internal allocator.
774
+ //!
775
+ //! <b>Throws</b>: If allocator's copy constructor throws.
776
+ //!
777
+ //! <b>Complexity</b>: Constant.
778
+ allocator_type get_allocator() const BOOST_CONTAINER_NOEXCEPT
779
+ { return this->alloc(); }
780
+
781
+ //! <b>Effects</b>: Returns a reference to the internal allocator.
782
+ //!
783
+ //! <b>Throws</b>: Nothing
784
+ //!
785
+ //! <b>Complexity</b>: Constant.
786
+ //!
787
+ //! <b>Note</b>: Non-standard extension.
788
+ stored_allocator_type &get_stored_allocator() BOOST_CONTAINER_NOEXCEPT
789
+ { return this->alloc(); }
790
+
791
+ //! <b>Effects</b>: Returns a reference to the internal allocator.
792
+ //!
793
+ //! <b>Throws</b>: Nothing
794
+ //!
795
+ //! <b>Complexity</b>: Constant.
796
+ //!
797
+ //! <b>Note</b>: Non-standard extension.
798
+ const stored_allocator_type &get_stored_allocator() const BOOST_CONTAINER_NOEXCEPT
799
+ { return this->alloc(); }
800
+
801
+ //////////////////////////////////////////////
802
+ //
803
+ // iterators
804
+ //
805
+ //////////////////////////////////////////////
806
+
807
+ //! <b>Effects</b>: Returns an iterator to the first element contained in the vector.
808
+ //!
809
+ //! <b>Throws</b>: Nothing.
810
+ //!
811
+ //! <b>Complexity</b>: Constant.
812
+ iterator begin() BOOST_CONTAINER_NOEXCEPT
813
+ { return this->priv_addr(); }
814
+
815
+ //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
816
+ //!
817
+ //! <b>Throws</b>: Nothing.
818
+ //!
819
+ //! <b>Complexity</b>: Constant.
820
+ const_iterator begin() const BOOST_CONTAINER_NOEXCEPT
821
+ { return this->priv_addr(); }
822
+
823
+ //! <b>Effects</b>: Returns an iterator to the end of the vector.
824
+ //!
825
+ //! <b>Throws</b>: Nothing.
826
+ //!
827
+ //! <b>Complexity</b>: Constant.
828
+ iterator end() BOOST_CONTAINER_NOEXCEPT
829
+ { return this->priv_end_addr(); }
830
+
831
+ //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
832
+ //!
833
+ //! <b>Throws</b>: Nothing.
834
+ //!
835
+ //! <b>Complexity</b>: Constant.
836
+ const_iterator end() const BOOST_CONTAINER_NOEXCEPT
837
+ { return this->priv_end_addr(); }
838
+
839
+ //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning
840
+ //! of the reversed vector.
841
+ //!
842
+ //! <b>Throws</b>: Nothing.
843
+ //!
844
+ //! <b>Complexity</b>: Constant.
845
+ reverse_iterator rbegin() BOOST_CONTAINER_NOEXCEPT
846
+ { return reverse_iterator(this->priv_end_addr()); }
847
+
848
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
849
+ //! of the reversed vector.
850
+ //!
851
+ //! <b>Throws</b>: Nothing.
852
+ //!
853
+ //! <b>Complexity</b>: Constant.
854
+ const_reverse_iterator rbegin() const BOOST_CONTAINER_NOEXCEPT
855
+ { return this->crbegin(); }
856
+
857
+ //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
858
+ //! of the reversed vector.
859
+ //!
860
+ //! <b>Throws</b>: Nothing.
861
+ //!
862
+ //! <b>Complexity</b>: Constant.
863
+ reverse_iterator rend() BOOST_CONTAINER_NOEXCEPT
864
+ { return reverse_iterator(this->priv_addr()); }
865
+
866
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
867
+ //! of the reversed vector.
868
+ //!
869
+ //! <b>Throws</b>: Nothing.
870
+ //!
871
+ //! <b>Complexity</b>: Constant.
872
+ const_reverse_iterator rend() const BOOST_CONTAINER_NOEXCEPT
873
+ { return this->crend(); }
874
+
875
+ //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
876
+ //!
877
+ //! <b>Throws</b>: Nothing.
878
+ //!
879
+ //! <b>Complexity</b>: Constant.
880
+ const_iterator cbegin() const BOOST_CONTAINER_NOEXCEPT
881
+ { return this->priv_addr(); }
882
+
883
+ //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
884
+ //!
885
+ //! <b>Throws</b>: Nothing.
886
+ //!
887
+ //! <b>Complexity</b>: Constant.
888
+ const_iterator cend() const BOOST_CONTAINER_NOEXCEPT
889
+ { return this->priv_end_addr(); }
890
+
891
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
892
+ //! of the reversed vector.
893
+ //!
894
+ //! <b>Throws</b>: Nothing.
895
+ //!
896
+ //! <b>Complexity</b>: Constant.
897
+ const_reverse_iterator crbegin() const BOOST_CONTAINER_NOEXCEPT
898
+ { return const_reverse_iterator(this->priv_end_addr()); }
899
+
900
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
901
+ //! of the reversed vector.
902
+ //!
903
+ //! <b>Throws</b>: Nothing.
904
+ //!
905
+ //! <b>Complexity</b>: Constant.
906
+ const_reverse_iterator crend() const BOOST_CONTAINER_NOEXCEPT
907
+ { return const_reverse_iterator(this->priv_addr()); }
908
+
909
+ //////////////////////////////////////////////
910
+ //
911
+ // capacity
912
+ //
913
+ //////////////////////////////////////////////
914
+
915
+ //! <b>Effects</b>: Returns true if the vector contains no elements.
916
+ //!
917
+ //! <b>Throws</b>: Nothing.
918
+ //!
919
+ //! <b>Complexity</b>: Constant.
920
+ bool empty() const BOOST_CONTAINER_NOEXCEPT
921
+ { return !this->priv_size(); }
922
+
923
+ //! <b>Effects</b>: Returns the number of the elements contained in the vector.
924
+ //!
925
+ //! <b>Throws</b>: Nothing.
926
+ //!
927
+ //! <b>Complexity</b>: Constant.
928
+ size_type size() const BOOST_CONTAINER_NOEXCEPT
929
+ { return this->priv_size(); }
930
+
931
+ //! <b>Effects</b>: Returns the number of the elements contained in the vector.
932
+ //!
933
+ //! <b>Throws</b>: Nothing.
934
+ //!
935
+ //! <b>Complexity</b>: Constant.
936
+ size_type length() const BOOST_CONTAINER_NOEXCEPT
937
+ { return this->size(); }
938
+
939
+ //! <b>Effects</b>: Returns the largest possible size of the vector.
940
+ //!
941
+ //! <b>Throws</b>: Nothing.
942
+ //!
943
+ //! <b>Complexity</b>: Constant.
944
+ size_type max_size() const BOOST_CONTAINER_NOEXCEPT
945
+ { return base_t::max_size(); }
946
+
947
+ //! <b>Effects</b>: Inserts or erases elements at the end such that
948
+ //! the size becomes n. New elements are copy constructed from x.
949
+ //!
950
+ //! <b>Throws</b>: If memory allocation throws
951
+ //!
952
+ //! <b>Complexity</b>: Linear to the difference between size() and new_size.
953
+ void resize(size_type n, CharT c)
954
+ {
955
+ if (n <= this->size())
956
+ this->erase(this->begin() + n, this->end());
957
+ else
958
+ this->append(n - this->size(), c);
959
+ }
960
+
961
+ //! <b>Effects</b>: Inserts or erases elements at the end such that
962
+ //! the size becomes n. New elements are default constructed.
963
+ //!
964
+ //! <b>Throws</b>: If memory allocation throws
965
+ //!
966
+ //! <b>Complexity</b>: Linear to the difference between size() and new_size.
967
+ void resize(size_type n)
968
+ { resize(n, CharT()); }
969
+
970
+ //! <b>Effects</b>: Number of elements for which memory has been allocated.
971
+ //! capacity() is always greater than or equal to size().
972
+ //!
973
+ //! <b>Throws</b>: Nothing.
974
+ //!
975
+ //! <b>Complexity</b>: Constant.
976
+ size_type capacity() const BOOST_CONTAINER_NOEXCEPT
977
+ { return this->priv_capacity(); }
978
+
979
+ //! <b>Effects</b>: If n is less than or equal to capacity(), this call has no
980
+ //! effect. Otherwise, it is a request for allocation of additional memory.
981
+ //! If the request is successful, then capacity() is greater than or equal to
982
+ //! n; otherwise, capacity() is unchanged. In either case, size() is unchanged.
983
+ //!
984
+ //! <b>Throws</b>: If memory allocation allocation throws
985
+ void reserve(size_type res_arg)
986
+ {
987
+ if (res_arg > this->max_size()){
988
+ throw_length_error("basic_string::reserve max_size() exceeded");
989
+ }
990
+
991
+ if (this->capacity() < res_arg){
992
+ size_type n = container_detail::max_value(res_arg, this->size()) + 1;
993
+ size_type new_cap = this->next_capacity(n);
994
+ pointer new_start = this->allocation_command
995
+ (allocate_new, n, new_cap, new_cap).first;
996
+ size_type new_length = 0;
997
+
998
+ const pointer addr = this->priv_addr();
999
+ new_length += priv_uninitialized_copy
1000
+ (addr, addr + this->priv_size(), new_start);
1001
+ this->priv_construct_null(new_start + new_length);
1002
+ this->deallocate_block();
1003
+ this->is_short(false);
1004
+ this->priv_long_addr(new_start);
1005
+ this->priv_long_size(new_length);
1006
+ this->priv_storage(new_cap);
1007
+ }
1008
+ }
1009
+
1010
+ //! <b>Effects</b>: Tries to deallocate the excess of memory created
1011
+ //! with previous allocations. The size of the string is unchanged
1012
+ //!
1013
+ //! <b>Throws</b>: Nothing
1014
+ //!
1015
+ //! <b>Complexity</b>: Linear to size().
1016
+ void shrink_to_fit()
1017
+ {
1018
+ //Check if shrinking is possible
1019
+ if(this->priv_storage() > InternalBufferChars){
1020
+ //Check if we should pass from dynamically allocated buffer
1021
+ //to the internal storage
1022
+ if(this->priv_size() < InternalBufferChars){
1023
+ //Dynamically allocated buffer attributes
1024
+ pointer long_addr = this->priv_long_addr();
1025
+ size_type long_storage = this->priv_long_storage();
1026
+ size_type long_size = this->priv_long_size();
1027
+ //Shrink from allocated buffer to the internal one, including trailing null
1028
+ Traits::copy( container_detail::to_raw_pointer(this->priv_short_addr())
1029
+ , container_detail::to_raw_pointer(long_addr)
1030
+ , long_size+1);
1031
+ this->is_short(true);
1032
+ this->alloc().deallocate(long_addr, long_storage);
1033
+ }
1034
+ else{
1035
+ //Shrinking in dynamic buffer
1036
+ this->priv_shrink_to_fit_dynamic_buffer(alloc_version());
1037
+ }
1038
+ }
1039
+ }
1040
+
1041
+ //////////////////////////////////////////////
1042
+ //
1043
+ // element access
1044
+ //
1045
+ //////////////////////////////////////////////
1046
+
1047
+ //! <b>Requires</b>: size() > n.
1048
+ //!
1049
+ //! <b>Effects</b>: Returns a reference to the nth element
1050
+ //! from the beginning of the container.
1051
+ //!
1052
+ //! <b>Throws</b>: Nothing.
1053
+ //!
1054
+ //! <b>Complexity</b>: Constant.
1055
+ reference operator[](size_type n) BOOST_CONTAINER_NOEXCEPT
1056
+ { return *(this->priv_addr() + n); }
1057
+
1058
+ //! <b>Requires</b>: size() > n.
1059
+ //!
1060
+ //! <b>Effects</b>: Returns a const reference to the nth element
1061
+ //! from the beginning of the container.
1062
+ //!
1063
+ //! <b>Throws</b>: Nothing.
1064
+ //!
1065
+ //! <b>Complexity</b>: Constant.
1066
+ const_reference operator[](size_type n) const BOOST_CONTAINER_NOEXCEPT
1067
+ { return *(this->priv_addr() + n); }
1068
+
1069
+ //! <b>Requires</b>: size() > n.
1070
+ //!
1071
+ //! <b>Effects</b>: Returns a reference to the nth element
1072
+ //! from the beginning of the container.
1073
+ //!
1074
+ //! <b>Throws</b>: std::range_error if n >= size()
1075
+ //!
1076
+ //! <b>Complexity</b>: Constant.
1077
+ reference at(size_type n)
1078
+ {
1079
+ if (n >= this->size())
1080
+ throw_out_of_range("basic_string::at invalid subscript");
1081
+ return *(this->priv_addr() + n);
1082
+ }
1083
+
1084
+ //! <b>Requires</b>: size() > n.
1085
+ //!
1086
+ //! <b>Effects</b>: Returns a const reference to the nth element
1087
+ //! from the beginning of the container.
1088
+ //!
1089
+ //! <b>Throws</b>: std::range_error if n >= size()
1090
+ //!
1091
+ //! <b>Complexity</b>: Constant.
1092
+ const_reference at(size_type n) const {
1093
+ if (n >= this->size())
1094
+ throw_out_of_range("basic_string::at invalid subscript");
1095
+ return *(this->priv_addr() + n);
1096
+ }
1097
+
1098
+ //////////////////////////////////////////////
1099
+ //
1100
+ // modifiers
1101
+ //
1102
+ //////////////////////////////////////////////
1103
+
1104
+ //! <b>Effects</b>: Calls append(str.data, str.size()).
1105
+ //!
1106
+ //! <b>Returns</b>: *this
1107
+ basic_string& operator+=(const basic_string& s)
1108
+ { return this->append(s); }
1109
+
1110
+ //! <b>Effects</b>: Calls append(s).
1111
+ //!
1112
+ //! <b>Returns</b>: *this
1113
+ basic_string& operator+=(const CharT* s)
1114
+ { return this->append(s); }
1115
+
1116
+ //! <b>Effects</b>: Calls append(1, c).
1117
+ //!
1118
+ //! <b>Returns</b>: *this
1119
+ basic_string& operator+=(CharT c)
1120
+ { this->push_back(c); return *this; }
1121
+
1122
+ //! <b>Effects</b>: Calls append(str.data(), str.size()).
1123
+ //!
1124
+ //! <b>Returns</b>: *this
1125
+ basic_string& append(const basic_string& s)
1126
+ { return this->append(s.begin(), s.end()); }
1127
+
1128
+ //! <b>Requires</b>: pos <= str.size()
1129
+ //!
1130
+ //! <b>Effects</b>: Determines the effective length rlen of the string to append
1131
+ //! as the smaller of n and str.size() - pos and calls append(str.data() + pos, rlen).
1132
+ //!
1133
+ //! <b>Throws</b>: If memory allocation throws and out_of_range if pos > str.size()
1134
+ //!
1135
+ //! <b>Returns</b>: *this
1136
+ basic_string& append(const basic_string& s, size_type pos, size_type n)
1137
+ {
1138
+ if (pos > s.size())
1139
+ throw_out_of_range("basic_string::append out of range position");
1140
+ return this->append(s.begin() + pos,
1141
+ s.begin() + pos + container_detail::min_value(n, s.size() - pos));
1142
+ }
1143
+
1144
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
1145
+ //!
1146
+ //! <b>Effects</b>: The function replaces the string controlled by *this with
1147
+ //! a string of length size() + n whose irst size() elements are a copy of the
1148
+ //! original string controlled by *this and whose remaining
1149
+ //! elements are a copy of the initial n elements of s.
1150
+ //!
1151
+ //! <b>Throws</b>: If memory allocation throws length_error if size() + n > max_size().
1152
+ //!
1153
+ //! <b>Returns</b>: *this
1154
+ basic_string& append(const CharT* s, size_type n)
1155
+ { return this->append(s, s + n); }
1156
+
1157
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
1158
+ //!
1159
+ //! <b>Effects</b>: Calls append(s, traits::length(s)).
1160
+ //!
1161
+ //! <b>Returns</b>: *this
1162
+ basic_string& append(const CharT* s)
1163
+ { return this->append(s, s + Traits::length(s)); }
1164
+
1165
+ //! <b>Effects</b>: Equivalent to append(basic_string(n, c)).
1166
+ //!
1167
+ //! <b>Returns</b>: *this
1168
+ basic_string& append(size_type n, CharT c)
1169
+ { return this->append(cvalue_iterator(c, n), cvalue_iterator()); }
1170
+
1171
+ //! <b>Requires</b>: [first,last) is a valid range.
1172
+ //!
1173
+ //! <b>Effects</b>: Equivalent to append(basic_string(first, last)).
1174
+ //!
1175
+ //! <b>Returns</b>: *this
1176
+ template <class InputIter>
1177
+ basic_string& append(InputIter first, InputIter last)
1178
+ { this->insert(this->end(), first, last); return *this; }
1179
+
1180
+ //! <b>Effects</b>: Equivalent to append(static_cast<size_type>(1), c).
1181
+ void push_back(CharT c)
1182
+ {
1183
+ const size_type old_size = this->priv_size();
1184
+ if (old_size < this->capacity()){
1185
+ const pointer addr = this->priv_addr();
1186
+ this->priv_construct_null(addr + old_size + 1);
1187
+ Traits::assign(addr[old_size], c);
1188
+ this->priv_size(old_size+1);
1189
+ }
1190
+ else{
1191
+ //No enough memory, insert a new object at the end
1192
+ this->append(size_type(1), c);
1193
+ }
1194
+ }
1195
+
1196
+ //! <b>Effects</b>: Equivalent to assign(str, 0, npos).
1197
+ //!
1198
+ //! <b>Returns</b>: *this
1199
+ basic_string& assign(const basic_string& s)
1200
+ { return this->operator=(s); }
1201
+
1202
+ //! <b>Effects</b>: The function replaces the string controlled by *this
1203
+ //! with a string of length str.size() whose elements are a copy of the string
1204
+ //! controlled by str. Leaves str in a valid but unspecified state.
1205
+ //!
1206
+ //! <b>Throws</b>: Nothing
1207
+ //!
1208
+ //! <b>Returns</b>: *this
1209
+ basic_string& assign(BOOST_RV_REF(basic_string) ms) BOOST_CONTAINER_NOEXCEPT
1210
+ { return this->swap_data(ms), *this; }
1211
+
1212
+ //! <b>Requires</b>: pos <= str.size()
1213
+ //!
1214
+ //! <b>Effects</b>: Determines the effective length rlen of the string to assign as
1215
+ //! the smaller of n and str.size() - pos and calls assign(str.data() + pos rlen).
1216
+ //!
1217
+ //! <b>Throws</b>: If memory allocation throws or out_of_range if pos > str.size().
1218
+ //!
1219
+ //! <b>Returns</b>: *this
1220
+ basic_string& assign(const basic_string& s, size_type pos, size_type n)
1221
+ {
1222
+ if (pos > s.size())
1223
+ throw_out_of_range("basic_string::assign out of range position");
1224
+ return this->assign(s.begin() + pos,
1225
+ s.begin() + pos + container_detail::min_value(n, s.size() - pos));
1226
+ }
1227
+
1228
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
1229
+ //!
1230
+ //! <b>Effects</b>: Replaces the string controlled by *this with a string of
1231
+ //! length n whose elements are a copy of those pointed to by s.
1232
+ //!
1233
+ //! <b>Throws</b>: If memory allocation throws or length_error if n > max_size().
1234
+ //!
1235
+ //! <b>Returns</b>: *this
1236
+ basic_string& assign(const CharT* s, size_type n)
1237
+ { return this->assign(s, s + n); }
1238
+
1239
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
1240
+ //!
1241
+ //! <b>Effects</b>: Calls assign(s, traits::length(s)).
1242
+ //!
1243
+ //! <b>Returns</b>: *this
1244
+ basic_string& assign(const CharT* s)
1245
+ { return this->assign(s, s + Traits::length(s)); }
1246
+
1247
+ //! <b>Effects</b>: Equivalent to assign(basic_string(n, c)).
1248
+ //!
1249
+ //! <b>Returns</b>: *this
1250
+ basic_string& assign(size_type n, CharT c)
1251
+ { return this->assign(cvalue_iterator(c, n), cvalue_iterator()); }
1252
+
1253
+ //! <b>Effects</b>: Equivalent to assign(basic_string(first, last)).
1254
+ //!
1255
+ //! <b>Returns</b>: *this
1256
+ template <class InputIter>
1257
+ basic_string& assign(InputIter first, InputIter last
1258
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1259
+ , typename container_detail::enable_if_c
1260
+ < !container_detail::is_convertible<InputIter, size_type>::value
1261
+ >::type * = 0
1262
+ #endif
1263
+ )
1264
+ {
1265
+ size_type cur = 0;
1266
+ const pointer addr = this->priv_addr();
1267
+ CharT *ptr = container_detail::to_raw_pointer(addr);
1268
+ const size_type old_size = this->priv_size();
1269
+ while (first != last && cur != old_size) {
1270
+ Traits::assign(*ptr, *first);
1271
+ ++first;
1272
+ ++cur;
1273
+ ++ptr;
1274
+ }
1275
+ if (first == last)
1276
+ this->erase(addr + cur, addr + old_size);
1277
+ else
1278
+ this->append(first, last);
1279
+ return *this;
1280
+ }
1281
+
1282
+ //! <b>Requires</b>: pos <= size().
1283
+ //!
1284
+ //! <b>Effects</b>: Calls insert(pos, str.data(), str.size()).
1285
+ //!
1286
+ //! <b>Throws</b>: If memory allocation throws or out_of_range if pos > size().
1287
+ //!
1288
+ //! <b>Returns</b>: *this
1289
+ basic_string& insert(size_type pos, const basic_string& s)
1290
+ {
1291
+ const size_type sz = this->size();
1292
+ if (pos > sz)
1293
+ throw_out_of_range("basic_string::insert out of range position");
1294
+ if (sz > this->max_size() - s.size())
1295
+ throw_length_error("basic_string::insert max_size() exceeded");
1296
+ this->insert(this->priv_addr() + pos, s.begin(), s.end());
1297
+ return *this;
1298
+ }
1299
+
1300
+ //! <b>Requires</b>: pos1 <= size() and pos2 <= str.size()
1301
+ //!
1302
+ //! <b>Effects</b>: Determines the effective length rlen of the string to insert as
1303
+ //! the smaller of n and str.size() - pos2 and calls insert(pos1, str.data() + pos2, rlen).
1304
+ //!
1305
+ //! <b>Throws</b>: If memory allocation throws or out_of_range if pos1 > size() or pos2 > str.size().
1306
+ //!
1307
+ //! <b>Returns</b>: *this
1308
+ basic_string& insert(size_type pos1, const basic_string& s, size_type pos2, size_type n)
1309
+ {
1310
+ const size_type sz = this->size();
1311
+ const size_type str_size = s.size();
1312
+ if (pos1 > sz || pos2 > str_size)
1313
+ throw_out_of_range("basic_string::insert out of range position");
1314
+ size_type len = container_detail::min_value(n, str_size - pos2);
1315
+ if (sz > this->max_size() - len)
1316
+ throw_length_error("basic_string::insert max_size() exceeded");
1317
+ const CharT *beg_ptr = container_detail::to_raw_pointer(s.begin()) + pos2;
1318
+ const CharT *end_ptr = beg_ptr + len;
1319
+ this->insert(this->priv_addr() + pos1, beg_ptr, end_ptr);
1320
+ return *this;
1321
+ }
1322
+
1323
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT and pos <= size().
1324
+ //!
1325
+ //! <b>Effects</b>: Replaces the string controlled by *this with a string of length size() + n
1326
+ //! whose first pos elements are a copy of the initial elements of the original string
1327
+ //! controlled by *this and whose next n elements are a copy of the elements in s and whose
1328
+ //! remaining elements are a copy of the remaining elements of the original string controlled by *this.
1329
+ //!
1330
+ //! <b>Throws</b>: If memory allocation throws, out_of_range if pos > size() or
1331
+ //! length_error if size() + n > max_size().
1332
+ //!
1333
+ //! <b>Returns</b>: *this
1334
+ basic_string& insert(size_type pos, const CharT* s, size_type n)
1335
+ {
1336
+ if (pos > this->size())
1337
+ throw_out_of_range("basic_string::insert out of range position");
1338
+ if (this->size() > this->max_size() - n)
1339
+ throw_length_error("basic_string::insert max_size() exceeded");
1340
+ this->insert(this->priv_addr() + pos, s, s + n);
1341
+ return *this;
1342
+ }
1343
+
1344
+ //! <b>Requires</b>: pos <= size() and s points to an array of at least traits::length(s) + 1 elements of CharT
1345
+ //!
1346
+ //! <b>Effects</b>: Calls insert(pos, s, traits::length(s)).
1347
+ //!
1348
+ //! <b>Throws</b>: If memory allocation throws, out_of_range if pos > size()
1349
+ //! length_error if size() > max_size() - Traits::length(s)
1350
+ //!
1351
+ //! <b>Returns</b>: *this
1352
+ basic_string& insert(size_type pos, const CharT* s)
1353
+ {
1354
+ if (pos > this->size())
1355
+ throw_out_of_range("basic_string::insert out of range position");
1356
+ size_type len = Traits::length(s);
1357
+ if (this->size() > this->max_size() - len)
1358
+ throw_length_error("basic_string::insert max_size() exceeded");
1359
+ this->insert(this->priv_addr() + pos, s, s + len);
1360
+ return *this;
1361
+ }
1362
+
1363
+ //! <b>Effects</b>: Equivalent to insert(pos, basic_string(n, c)).
1364
+ //!
1365
+ //! <b>Throws</b>: If memory allocation throws, out_of_range if pos > size()
1366
+ //! length_error if size() > max_size() - n
1367
+ //!
1368
+ //! <b>Returns</b>: *this
1369
+ basic_string& insert(size_type pos, size_type n, CharT c)
1370
+ {
1371
+ if (pos > this->size())
1372
+ throw_out_of_range("basic_string::insert out of range position");
1373
+ if (this->size() > this->max_size() - n)
1374
+ throw_length_error("basic_string::insert max_size() exceeded");
1375
+ this->insert(const_iterator(this->priv_addr() + pos), n, c);
1376
+ return *this;
1377
+ }
1378
+
1379
+ //! <b>Requires</b>: p is a valid iterator on *this.
1380
+ //!
1381
+ //! <b>Effects</b>: inserts a copy of c before the character referred to by p.
1382
+ //!
1383
+ //! <b>Returns</b>: An iterator which refers to the copy of the inserted character.
1384
+ iterator insert(const_iterator p, CharT c)
1385
+ {
1386
+ size_type new_offset = p - this->priv_addr();
1387
+ this->insert(p, cvalue_iterator(c, 1), cvalue_iterator());
1388
+ return this->priv_addr() + new_offset;
1389
+ }
1390
+
1391
+
1392
+ //! <b>Requires</b>: p is a valid iterator on *this.
1393
+ //!
1394
+ //! <b>Effects</b>: Inserts n copies of c before the character referred to by p.
1395
+ //!
1396
+ //! <b>Returns</b>: an iterator to the first inserted element or p if n is 0.
1397
+ iterator insert(const_iterator p, size_type n, CharT c)
1398
+ { return this->insert(p, cvalue_iterator(c, n), cvalue_iterator()); }
1399
+
1400
+ //! <b>Requires</b>: p is a valid iterator on *this. [first,last) is a valid range.
1401
+ //!
1402
+ //! <b>Effects</b>: Equivalent to insert(p - begin(), basic_string(first, last)).
1403
+ //!
1404
+ //! <b>Returns</b>: an iterator to the first inserted element or p if first == last.
1405
+ template <class InputIter>
1406
+ iterator insert(const_iterator p, InputIter first, InputIter last
1407
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1408
+ , typename container_detail::enable_if_c
1409
+ < !container_detail::is_convertible<InputIter, size_type>::value
1410
+ && container_detail::is_input_iterator<InputIter>::value
1411
+ >::type * = 0
1412
+ #endif
1413
+ )
1414
+ {
1415
+ const size_type n_pos = p - this->cbegin();
1416
+ for ( ; first != last; ++first, ++p) {
1417
+ p = this->insert(p, *first);
1418
+ }
1419
+ return this->begin() + n_pos;
1420
+ }
1421
+
1422
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1423
+ template <class ForwardIter>
1424
+ iterator insert(const_iterator p, ForwardIter first, ForwardIter last
1425
+ , typename container_detail::enable_if_c
1426
+ < !container_detail::is_convertible<ForwardIter, size_type>::value
1427
+ && !container_detail::is_input_iterator<ForwardIter>::value
1428
+ >::type * = 0
1429
+ )
1430
+ {
1431
+ const size_type n_pos = p - this->cbegin();
1432
+ if (first != last) {
1433
+ const size_type n = std::distance(first, last);
1434
+ const size_type old_size = this->priv_size();
1435
+ const size_type remaining = this->capacity() - old_size;
1436
+ const pointer old_start = this->priv_addr();
1437
+ bool enough_capacity = false;
1438
+ std::pair<pointer, bool> allocation_ret;
1439
+ size_type new_cap = 0;
1440
+
1441
+ //Check if we have enough capacity
1442
+ if (remaining >= n){
1443
+ enough_capacity = true;
1444
+ }
1445
+ else {
1446
+ //Otherwise expand current buffer or allocate new storage
1447
+ new_cap = this->next_capacity(n);
1448
+ allocation_ret = this->allocation_command
1449
+ (allocate_new | expand_fwd | expand_bwd, old_size + n + 1,
1450
+ new_cap, new_cap, old_start);
1451
+
1452
+ //Check forward expansion
1453
+ if(old_start == allocation_ret.first){
1454
+ enough_capacity = true;
1455
+ this->priv_storage(new_cap);
1456
+ }
1457
+ }
1458
+
1459
+ //Reuse same buffer
1460
+ if(enough_capacity){
1461
+ const size_type elems_after = old_size - (p - old_start);
1462
+ const size_type old_length = old_size;
1463
+ if (elems_after >= n) {
1464
+ const pointer pointer_past_last = old_start + old_size + 1;
1465
+ priv_uninitialized_copy(old_start + (old_size - n + 1),
1466
+ pointer_past_last, pointer_past_last);
1467
+
1468
+ this->priv_size(old_size+n);
1469
+ Traits::move(const_cast<CharT*>(container_detail::to_raw_pointer(p + n)),
1470
+ container_detail::to_raw_pointer(p),
1471
+ (elems_after - n) + 1);
1472
+ this->priv_copy(first, last, const_cast<CharT*>(container_detail::to_raw_pointer(p)));
1473
+ }
1474
+ else {
1475
+ ForwardIter mid = first;
1476
+ std::advance(mid, elems_after + 1);
1477
+
1478
+ priv_uninitialized_copy(mid, last, old_start + old_size + 1);
1479
+ const size_type newer_size = old_size + (n - elems_after);
1480
+ this->priv_size(newer_size);
1481
+ priv_uninitialized_copy
1482
+ (p, const_iterator(old_start + old_length + 1),
1483
+ old_start + newer_size);
1484
+ this->priv_size(newer_size + elems_after);
1485
+ this->priv_copy(first, mid, const_cast<CharT*>(container_detail::to_raw_pointer(p)));
1486
+ }
1487
+ }
1488
+ else{
1489
+ pointer new_start = allocation_ret.first;
1490
+ if(!allocation_ret.second){
1491
+ //Copy data to new buffer
1492
+ size_type new_length = 0;
1493
+ //This can't throw, since characters are POD
1494
+ new_length += priv_uninitialized_copy
1495
+ (const_iterator(old_start), p, new_start);
1496
+ new_length += priv_uninitialized_copy
1497
+ (first, last, new_start + new_length);
1498
+ new_length += priv_uninitialized_copy
1499
+ (p, const_iterator(old_start + old_size),
1500
+ new_start + new_length);
1501
+ this->priv_construct_null(new_start + new_length);
1502
+
1503
+ this->deallocate_block();
1504
+ this->is_short(false);
1505
+ this->priv_long_addr(new_start);
1506
+ this->priv_long_size(new_length);
1507
+ this->priv_long_storage(new_cap);
1508
+ }
1509
+ else{
1510
+ //value_type is POD, so backwards expansion is much easier
1511
+ //than with vector<T>
1512
+ value_type * const oldbuf = container_detail::to_raw_pointer(old_start);
1513
+ value_type * const newbuf = container_detail::to_raw_pointer(new_start);
1514
+ const value_type *const pos = container_detail::to_raw_pointer(p);
1515
+ const size_type before = pos - oldbuf;
1516
+
1517
+ //First move old data
1518
+ Traits::move(newbuf, oldbuf, before);
1519
+ Traits::move(newbuf + before + n, pos, old_size - before);
1520
+ //Now initialize the new data
1521
+ priv_uninitialized_copy(first, last, new_start + before);
1522
+ this->priv_construct_null(new_start + (old_size + n));
1523
+ this->is_short(false);
1524
+ this->priv_long_addr(new_start);
1525
+ this->priv_long_size(old_size + n);
1526
+ this->priv_long_storage(new_cap);
1527
+ }
1528
+ }
1529
+ }
1530
+ return this->begin() + n_pos;
1531
+ }
1532
+ #endif
1533
+
1534
+ //! <b>Requires</b>: pos <= size()
1535
+ //!
1536
+ //! <b>Effects</b>: Determines the effective length xlen of the string to be removed as the smaller of n and size() - pos.
1537
+ //! The function then replaces the string controlled by *this with a string of length size() - xlen
1538
+ //! whose first pos elements are a copy of the initial elements of the original string controlled by *this,
1539
+ //! and whose remaining elements are a copy of the elements of the original string controlled by *this
1540
+ //! beginning at position pos + xlen.
1541
+ //!
1542
+ //! <b>Throws</b>: out_of_range if pos > size().
1543
+ //!
1544
+ //! <b>Returns</b>: *this
1545
+ basic_string& erase(size_type pos = 0, size_type n = npos)
1546
+ {
1547
+ if (pos > this->size())
1548
+ throw_out_of_range("basic_string::erase out of range position");
1549
+ const pointer addr = this->priv_addr();
1550
+ erase(addr + pos, addr + pos + container_detail::min_value(n, this->size() - pos));
1551
+ return *this;
1552
+ }
1553
+
1554
+ //! <b>Effects</b>: Removes the character referred to by p.
1555
+ //!
1556
+ //! <b>Throws</b>: Nothing
1557
+ //!
1558
+ //! <b>Returns</b>: An iterator which points to the element immediately following p prior to the element being
1559
+ //! erased. If no such element exists, end() is returned.
1560
+ iterator erase(const_iterator p) BOOST_CONTAINER_NOEXCEPT
1561
+ {
1562
+ // The move includes the terminating null.
1563
+ CharT * const ptr = const_cast<CharT*>(container_detail::to_raw_pointer(p));
1564
+ const size_type old_size = this->priv_size();
1565
+ Traits::move(ptr,
1566
+ container_detail::to_raw_pointer(p + 1),
1567
+ old_size - (p - this->priv_addr()));
1568
+ this->priv_size(old_size-1);
1569
+ return iterator(ptr);
1570
+ }
1571
+
1572
+ //! <b>Requires</b>: first and last are valid iterators on *this, defining a range [first,last).
1573
+ //!
1574
+ //! <b>Effects</b>: Removes the characters in the range [first,last).
1575
+ //!
1576
+ //! <b>Throws</b>: Nothing
1577
+ //!
1578
+ //! <b>Returns</b>: An iterator which points to the element pointed to by last prior to
1579
+ //! the other elements being erased. If no such element exists, end() is returned.
1580
+ iterator erase(const_iterator first, const_iterator last) BOOST_CONTAINER_NOEXCEPT
1581
+ {
1582
+ CharT * f = const_cast<CharT*>(container_detail::to_raw_pointer(first));
1583
+ if (first != last) { // The move includes the terminating null.
1584
+ const size_type num_erased = last - first;
1585
+ const size_type old_size = this->priv_size();
1586
+ Traits::move(f,
1587
+ container_detail::to_raw_pointer(last),
1588
+ (old_size + 1)-(last - this->priv_addr()));
1589
+ const size_type new_length = old_size - num_erased;
1590
+ this->priv_size(new_length);
1591
+ }
1592
+ return iterator(f);
1593
+ }
1594
+
1595
+ //! <b>Requires</b>: !empty()
1596
+ //!
1597
+ //! <b>Throws</b>: Nothing
1598
+ //!
1599
+ //! <b>Effects</b>: Equivalent to erase(size() - 1, 1).
1600
+ void pop_back() BOOST_CONTAINER_NOEXCEPT
1601
+ {
1602
+ const size_type old_size = this->priv_size();
1603
+ Traits::assign(this->priv_addr()[old_size-1], CharT(0));
1604
+ this->priv_size(old_size-1);;
1605
+ }
1606
+
1607
+ //! <b>Effects</b>: Erases all the elements of the vector.
1608
+ //!
1609
+ //! <b>Throws</b>: Nothing.
1610
+ //!
1611
+ //! <b>Complexity</b>: Linear to the number of elements in the vector.
1612
+ void clear() BOOST_CONTAINER_NOEXCEPT
1613
+ {
1614
+ if (!this->empty()) {
1615
+ Traits::assign(*this->priv_addr(), CharT(0));
1616
+ this->priv_size(0);
1617
+ }
1618
+ }
1619
+
1620
+ //! <b>Requires</b>: pos1 <= size().
1621
+ //!
1622
+ //! <b>Effects</b>: Calls replace(pos1, n1, str.data(), str.size()).
1623
+ //!
1624
+ //! <b>Throws</b>: if memory allocation throws or out_of_range if pos1 > size().
1625
+ //!
1626
+ //! <b>Returns</b>: *this
1627
+ basic_string& replace(size_type pos1, size_type n1, const basic_string& str)
1628
+ {
1629
+ if (pos1 > this->size())
1630
+ throw_out_of_range("basic_string::replace out of range position");
1631
+ const size_type len = container_detail::min_value(n1, this->size() - pos1);
1632
+ if (this->size() - len >= this->max_size() - str.size())
1633
+ throw_length_error("basic_string::replace max_size() exceeded");
1634
+ const pointer addr = this->priv_addr();
1635
+ return this->replace( const_iterator(addr + pos1)
1636
+ , const_iterator(addr + pos1 + len)
1637
+ , str.begin(), str.end());
1638
+ }
1639
+
1640
+ //! <b>Requires</b>: pos1 <= size() and pos2 <= str.size().
1641
+ //!
1642
+ //! <b>Effects</b>: Determines the effective length rlen of the string to be
1643
+ //! inserted as the smaller of n2 and str.size() - pos2 and calls
1644
+ //! replace(pos1, n1, str.data() + pos2, rlen).
1645
+ //!
1646
+ //! <b>Throws</b>: if memory allocation throws, out_of_range if pos1 > size() or pos2 > str.size().
1647
+ //!
1648
+ //! <b>Returns</b>: *this
1649
+ basic_string& replace(size_type pos1, size_type n1,
1650
+ const basic_string& str, size_type pos2, size_type n2)
1651
+ {
1652
+ if (pos1 > this->size() || pos2 > str.size())
1653
+ throw_out_of_range("basic_string::replace out of range position");
1654
+ const size_type len1 = container_detail::min_value(n1, this->size() - pos1);
1655
+ const size_type len2 = container_detail::min_value(n2, str.size() - pos2);
1656
+ if (this->size() - len1 >= this->max_size() - len2)
1657
+ throw_length_error("basic_string::replace max_size() exceeded");
1658
+ const pointer addr = this->priv_addr();
1659
+ const pointer straddr = str.priv_addr();
1660
+ return this->replace(addr + pos1, addr + pos1 + len1,
1661
+ straddr + pos2, straddr + pos2 + len2);
1662
+ }
1663
+
1664
+ //! <b>Requires</b>: pos1 <= size() and s points to an array of at least n2 elements of CharT.
1665
+ //!
1666
+ //! <b>Effects</b>: Determines the effective length xlen of the string to be removed as the
1667
+ //! smaller of n1 and size() - pos1. If size() - xlen >= max_size() - n2 throws length_error.
1668
+ //! Otherwise, the function replaces the string controlled by *this with a string of
1669
+ //! length size() - xlen + n2 whose first pos1 elements are a copy of the initial elements
1670
+ //! of the original string controlled by *this, whose next n2 elements are a copy of the
1671
+ //! initial n2 elements of s, and whose remaining elements are a copy of the elements of
1672
+ //! the original string controlled by *this beginning at position pos + xlen.
1673
+ //!
1674
+ //! <b>Throws</b>: if memory allocation throws, out_of_range if pos1 > size() or length_error
1675
+ //! if the length of the resulting string would exceed max_size()
1676
+ //!
1677
+ //! <b>Returns</b>: *this
1678
+ basic_string& replace(size_type pos1, size_type n1, const CharT* s, size_type n2)
1679
+ {
1680
+ if (pos1 > this->size())
1681
+ throw_out_of_range("basic_string::replace out of range position");
1682
+ const size_type len = container_detail::min_value(n1, this->size() - pos1);
1683
+ if (n2 > this->max_size() || size() - len >= this->max_size() - n2)
1684
+ throw_length_error("basic_string::replace max_size() exceeded");
1685
+ const pointer addr = this->priv_addr();
1686
+ return this->replace(addr + pos1, addr + pos1 + len, s, s + n2);
1687
+ }
1688
+
1689
+ //! <b>Requires</b>: pos1 <= size() and s points to an array of at least n2 elements of CharT.
1690
+ //!
1691
+ //! <b>Effects</b>: Determines the effective length xlen of the string to be removed as the smaller
1692
+ //! of n1 and size() - pos1. If size() - xlen >= max_size() - n2 throws length_error. Otherwise,
1693
+ //! the function replaces the string controlled by *this with a string of length size() - xlen + n2
1694
+ //! whose first pos1 elements are a copy of the initial elements of the original string controlled
1695
+ //! by *this, whose next n2 elements are a copy of the initial n2 elements of s, and whose
1696
+ //! remaining elements are a copy of the elements of the original string controlled by *this
1697
+ //! beginning at position pos + xlen.
1698
+ //!
1699
+ //! <b>Throws</b>: if memory allocation throws, out_of_range if pos1 > size() or length_error
1700
+ //! if the length of the resulting string would exceed max_size()
1701
+ //!
1702
+ //! <b>Returns</b>: *this
1703
+ basic_string& replace(size_type pos, size_type n1, const CharT* s)
1704
+ {
1705
+ if (pos > this->size())
1706
+ throw_out_of_range("basic_string::replace out of range position");
1707
+ const size_type len = container_detail::min_value(n1, this->size() - pos);
1708
+ const size_type n2 = Traits::length(s);
1709
+ if (n2 > this->max_size() || this->size() - len >= this->max_size() - n2)
1710
+ throw_length_error("basic_string::replace max_size() exceeded");
1711
+ const pointer addr = this->priv_addr();
1712
+ return this->replace(addr + pos, addr + pos + len,
1713
+ s, s + Traits::length(s));
1714
+ }
1715
+
1716
+ //! <b>Requires</b>: pos1 <= size().
1717
+ //!
1718
+ //! <b>Effects</b>: Equivalent to replace(pos1, n1, basic_string(n2, c)).
1719
+ //!
1720
+ //! <b>Throws</b>: if memory allocation throws, out_of_range if pos1 > size() or length_error
1721
+ //! if the length of the resulting string would exceed max_size()
1722
+ //!
1723
+ //! <b>Returns</b>: *this
1724
+ basic_string& replace(size_type pos1, size_type n1, size_type n2, CharT c)
1725
+ {
1726
+ if (pos1 > this->size())
1727
+ throw_out_of_range("basic_string::replace out of range position");
1728
+ const size_type len = container_detail::min_value(n1, this->size() - pos1);
1729
+ if (n2 > this->max_size() || this->size() - len >= this->max_size() - n2)
1730
+ throw_length_error("basic_string::replace max_size() exceeded");
1731
+ const pointer addr = this->priv_addr();
1732
+ return this->replace(addr + pos1, addr + pos1 + len, n2, c);
1733
+ }
1734
+
1735
+ //! <b>Requires</b>: [begin(),i1) and [i1,i2) are valid ranges.
1736
+ //!
1737
+ //! <b>Effects</b>: Calls replace(i1 - begin(), i2 - i1, str).
1738
+ //!
1739
+ //! <b>Throws</b>: if memory allocation throws
1740
+ //!
1741
+ //! <b>Returns</b>: *this
1742
+ basic_string& replace(const_iterator i1, const_iterator i2, const basic_string& str)
1743
+ { return this->replace(i1, i2, str.begin(), str.end()); }
1744
+
1745
+ //! <b>Requires</b>: [begin(),i1) and [i1,i2) are valid ranges and
1746
+ //! s points to an array of at least n elements
1747
+ //!
1748
+ //! <b>Effects</b>: Calls replace(i1 - begin(), i2 - i1, s, n).
1749
+ //!
1750
+ //! <b>Throws</b>: if memory allocation throws
1751
+ //!
1752
+ //! <b>Returns</b>: *this
1753
+ basic_string& replace(const_iterator i1, const_iterator i2, const CharT* s, size_type n)
1754
+ { return this->replace(i1, i2, s, s + n); }
1755
+
1756
+ //! <b>Requires</b>: [begin(),i1) and [i1,i2) are valid ranges and s points to an
1757
+ //! array of at least traits::length(s) + 1 elements of CharT.
1758
+ //!
1759
+ //! <b>Effects</b>: Calls replace(i1 - begin(), i2 - i1, s, traits::length(s)).
1760
+ //!
1761
+ //! <b>Throws</b>: if memory allocation throws
1762
+ //!
1763
+ //! <b>Returns</b>: *this
1764
+ basic_string& replace(const_iterator i1, const_iterator i2, const CharT* s)
1765
+ { return this->replace(i1, i2, s, s + Traits::length(s)); }
1766
+
1767
+ //! <b>Requires</b>: [begin(),i1) and [i1,i2) are valid ranges.
1768
+ //!
1769
+ //! <b>Effects</b>: Calls replace(i1 - begin(), i2 - i1, basic_string(n, c)).
1770
+ //!
1771
+ //! <b>Throws</b>: if memory allocation throws
1772
+ //!
1773
+ //! <b>Returns</b>: *this
1774
+ basic_string& replace(const_iterator i1, const_iterator i2, size_type n, CharT c)
1775
+ {
1776
+ const size_type len = static_cast<size_type>(i2 - i1);
1777
+ if (len >= n) {
1778
+ Traits::assign(const_cast<CharT*>(container_detail::to_raw_pointer(i1)), n, c);
1779
+ erase(i1 + n, i2);
1780
+ }
1781
+ else {
1782
+ Traits::assign(const_cast<CharT*>(container_detail::to_raw_pointer(i1)), len, c);
1783
+ insert(i2, n - len, c);
1784
+ }
1785
+ return *this;
1786
+ }
1787
+
1788
+ //! <b>Requires</b>: [begin(),i1), [i1,i2) and [j1,j2) are valid ranges.
1789
+ //!
1790
+ //! <b>Effects</b>: Calls replace(i1 - begin(), i2 - i1, basic_string(j1, j2)).
1791
+ //!
1792
+ //! <b>Throws</b>: if memory allocation throws
1793
+ //!
1794
+ //! <b>Returns</b>: *this
1795
+ template <class InputIter>
1796
+ basic_string& replace(const_iterator i1, const_iterator i2, InputIter j1, InputIter j2
1797
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1798
+ , typename container_detail::enable_if_c
1799
+ < !container_detail::is_convertible<InputIter, size_type>::value
1800
+ && container_detail::is_input_iterator<InputIter>::value
1801
+ >::type * = 0
1802
+ #endif
1803
+ )
1804
+ {
1805
+ for ( ; i1 != i2 && j1 != j2; ++i1, ++j1){
1806
+ Traits::assign(*const_cast<CharT*>(container_detail::to_raw_pointer(i1)), *j1);
1807
+ }
1808
+
1809
+ if (j1 == j2)
1810
+ this->erase(i1, i2);
1811
+ else
1812
+ this->insert(i2, j1, j2);
1813
+ return *this;
1814
+ }
1815
+
1816
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1817
+ template <class ForwardIter>
1818
+ basic_string& replace(const_iterator i1, const_iterator i2, ForwardIter j1, ForwardIter j2
1819
+ , typename container_detail::enable_if_c
1820
+ < !container_detail::is_convertible<ForwardIter, size_type>::value
1821
+ && !container_detail::is_input_iterator<ForwardIter>::value
1822
+ >::type * = 0
1823
+ )
1824
+ {
1825
+ difference_type n = std::distance(j1, j2);
1826
+ const difference_type len = i2 - i1;
1827
+ if (len >= n) {
1828
+ this->priv_copy(j1, j2, const_cast<CharT*>(container_detail::to_raw_pointer(i1)));
1829
+ this->erase(i1 + n, i2);
1830
+ }
1831
+ else {
1832
+ ForwardIter m = j1;
1833
+ std::advance(m, len);
1834
+ this->priv_copy(j1, m, const_cast<CharT*>(container_detail::to_raw_pointer(i1)));
1835
+ this->insert(i2, m, j2);
1836
+ }
1837
+ return *this;
1838
+ }
1839
+ #endif
1840
+
1841
+ //! <b>Requires</b>: pos <= size()
1842
+ //!
1843
+ //! <b>Effects</b>: Determines the effective length rlen of the string to copy as the
1844
+ //! smaller of n and size() - pos. s shall designate an array of at least rlen elements.
1845
+ //! The function then replaces the string designated by s with a string of length rlen
1846
+ //! whose elements are a copy of the string controlled by *this beginning at position pos.
1847
+ //! The function does not append a null object to the string designated by s.
1848
+ //!
1849
+ //! <b>Throws</b>: if memory allocation throws, out_of_range if pos > size().
1850
+ //!
1851
+ //! <b>Returns</b>: rlen
1852
+ size_type copy(CharT* s, size_type n, size_type pos = 0) const
1853
+ {
1854
+ if (pos > this->size())
1855
+ throw_out_of_range("basic_string::copy out of range position");
1856
+ const size_type len = container_detail::min_value(n, this->size() - pos);
1857
+ Traits::copy(s, container_detail::to_raw_pointer(this->priv_addr() + pos), len);
1858
+ return len;
1859
+ }
1860
+
1861
+ //! <b>Effects</b>: *this contains the same sequence of characters that was in s,
1862
+ //! s contains the same sequence of characters that was in *this.
1863
+ //!
1864
+ //! <b>Throws</b>: Nothing
1865
+ void swap(basic_string& x)
1866
+ {
1867
+ this->base_t::swap_data(x);
1868
+ container_detail::bool_<allocator_traits_type::propagate_on_container_swap::value> flag;
1869
+ container_detail::swap_alloc(this->alloc(), x.alloc(), flag);
1870
+ }
1871
+
1872
+ //////////////////////////////////////////////
1873
+ //
1874
+ // data access
1875
+ //
1876
+ //////////////////////////////////////////////
1877
+
1878
+ //! <b>Requires</b>: The program shall not alter any of the values stored in the character array.
1879
+ //!
1880
+ //! <b>Returns</b>: Allocator pointer p such that p + i == &operator[](i) for each i in [0,size()].
1881
+ //!
1882
+ //! <b>Complexity</b>: constant time.
1883
+ const CharT* c_str() const BOOST_CONTAINER_NOEXCEPT
1884
+ { return container_detail::to_raw_pointer(this->priv_addr()); }
1885
+
1886
+ //! <b>Requires</b>: The program shall not alter any of the values stored in the character array.
1887
+ //!
1888
+ //! <b>Returns</b>: Allocator pointer p such that p + i == &operator[](i) for each i in [0,size()].
1889
+ //!
1890
+ //! <b>Complexity</b>: constant time.
1891
+ const CharT* data() const BOOST_CONTAINER_NOEXCEPT
1892
+ { return container_detail::to_raw_pointer(this->priv_addr()); }
1893
+
1894
+ //////////////////////////////////////////////
1895
+ //
1896
+ // string operations
1897
+ //
1898
+ //////////////////////////////////////////////
1899
+
1900
+ //! <b>Effects</b>: Determines the lowest position xpos, if possible, such that both
1901
+ //! of the following conditions obtain: 19 pos <= xpos and xpos + str.size() <= size();
1902
+ //! 2) traits::eq(at(xpos+I), str.at(I)) for all elements I of the string controlled by str.
1903
+ //!
1904
+ //! <b>Throws</b>: Nothing
1905
+ //!
1906
+ //! <b>Returns</b>: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
1907
+ size_type find(const basic_string& s, size_type pos = 0) const
1908
+ { return find(s.c_str(), pos, s.size()); }
1909
+
1910
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
1911
+ //!
1912
+ //! <b>Throws</b>: Nothing
1913
+ //!
1914
+ //! <b>Returns</b>: find(basic_string<CharT,traits,Allocator>(s,n),pos).
1915
+ size_type find(const CharT* s, size_type pos, size_type n) const
1916
+ {
1917
+ if (pos + n > this->size())
1918
+ return npos;
1919
+ else {
1920
+ const pointer addr = this->priv_addr();
1921
+ pointer finish = addr + this->priv_size();
1922
+ const const_iterator result =
1923
+ std::search(container_detail::to_raw_pointer(addr + pos),
1924
+ container_detail::to_raw_pointer(finish),
1925
+ s, s + n, Eq_traits<Traits>());
1926
+ return result != finish ? result - begin() : npos;
1927
+ }
1928
+ }
1929
+
1930
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
1931
+ //!
1932
+ //! <b>Throws</b>: Nothing
1933
+ //!
1934
+ //! <b>Returns</b>: find(basic_string(s), pos).
1935
+ size_type find(const CharT* s, size_type pos = 0) const
1936
+ { return this->find(s, pos, Traits::length(s)); }
1937
+
1938
+ //! <b>Throws</b>: Nothing
1939
+ //!
1940
+ //! <b>Returns</b>: find(basic_string<CharT,traits,Allocator>(1,c), pos).
1941
+ size_type find(CharT c, size_type pos = 0) const
1942
+ {
1943
+ const size_type sz = this->size();
1944
+ if (pos >= sz)
1945
+ return npos;
1946
+ else {
1947
+ const pointer addr = this->priv_addr();
1948
+ pointer finish = addr + sz;
1949
+ const const_iterator result =
1950
+ std::find_if(addr + pos, finish,
1951
+ std::bind2nd(Eq_traits<Traits>(), c));
1952
+ return result != finish ? result - begin() : npos;
1953
+ }
1954
+ }
1955
+
1956
+ //! <b>Effects</b>: Determines the highest position xpos, if possible, such
1957
+ //! that both of the following conditions obtain:
1958
+ //! a) xpos <= pos and xpos + str.size() <= size();
1959
+ //! b) traits::eq(at(xpos+I), str.at(I)) for all elements I of the string controlled by str.
1960
+ //!
1961
+ //! <b>Throws</b>: Nothing
1962
+ //!
1963
+ //! <b>Returns</b>: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
1964
+ size_type rfind(const basic_string& str, size_type pos = npos) const
1965
+ { return rfind(str.c_str(), pos, str.size()); }
1966
+
1967
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
1968
+ //!
1969
+ //! <b>Throws</b>: Nothing
1970
+ //!
1971
+ //! <b>Returns</b>: rfind(basic_string(s, n), pos).
1972
+ size_type rfind(const CharT* s, size_type pos, size_type n) const
1973
+ {
1974
+ const size_type len = this->size();
1975
+
1976
+ if (n > len)
1977
+ return npos;
1978
+ else if (n == 0)
1979
+ return container_detail::min_value(len, pos);
1980
+ else {
1981
+ const const_iterator last = begin() + container_detail::min_value(len - n, pos) + n;
1982
+ const const_iterator result = find_end(begin(), last,
1983
+ s, s + n,
1984
+ Eq_traits<Traits>());
1985
+ return result != last ? result - begin() : npos;
1986
+ }
1987
+ }
1988
+
1989
+ //! <b>Requires</b>: pos <= size() and s points to an array of at least
1990
+ //! traits::length(s) + 1 elements of CharT.
1991
+ //!
1992
+ //! <b>Throws</b>: Nothing
1993
+ //!
1994
+ //! <b>Returns</b>: rfind(basic_string(s), pos).
1995
+ size_type rfind(const CharT* s, size_type pos = npos) const
1996
+ { return rfind(s, pos, Traits::length(s)); }
1997
+
1998
+ //! <b>Throws</b>: Nothing
1999
+ //!
2000
+ //! <b>Returns</b>: rfind(basic_string<CharT,traits,Allocator>(1,c),pos).
2001
+ size_type rfind(CharT c, size_type pos = npos) const
2002
+ {
2003
+ const size_type len = this->size();
2004
+
2005
+ if (len < 1)
2006
+ return npos;
2007
+ else {
2008
+ const const_iterator last = begin() + container_detail::min_value(len - 1, pos) + 1;
2009
+ const_reverse_iterator rresult =
2010
+ std::find_if(const_reverse_iterator(last), rend(),
2011
+ std::bind2nd(Eq_traits<Traits>(), c));
2012
+ return rresult != rend() ? (rresult.base() - 1) - begin() : npos;
2013
+ }
2014
+ }
2015
+
2016
+ //! <b>Effects</b>: Determines the lowest position xpos, if possible, such that both of the
2017
+ //! following conditions obtain: a) pos <= xpos and xpos < size();
2018
+ //! b) traits::eq(at(xpos), str.at(I)) for some element I of the string controlled by str.
2019
+ //!
2020
+ //! <b>Throws</b>: Nothing
2021
+ //!
2022
+ //! <b>Returns</b>: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
2023
+ size_type find_first_of(const basic_string& s, size_type pos = 0) const
2024
+ { return find_first_of(s.c_str(), pos, s.size()); }
2025
+
2026
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
2027
+ //!
2028
+ //! <b>Throws</b>: Nothing
2029
+ //!
2030
+ //! <b>Returns</b>: find_first_of(basic_string(s, n), pos).
2031
+ size_type find_first_of(const CharT* s, size_type pos, size_type n) const
2032
+ {
2033
+ const size_type sz = this->size();
2034
+ if (pos >= sz)
2035
+ return npos;
2036
+ else {
2037
+ const pointer addr = this->priv_addr();
2038
+ pointer finish = addr + sz;
2039
+ const_iterator result = std::find_first_of
2040
+ (addr + pos, finish, s, s + n, Eq_traits<Traits>());
2041
+ return result != finish ? result - this->begin() : npos;
2042
+ }
2043
+ }
2044
+
2045
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
2046
+ //!
2047
+ //! <b>Throws</b>: Nothing
2048
+ //!
2049
+ //! <b>Returns</b>: find_first_of(basic_string(s), pos).
2050
+ size_type find_first_of(const CharT* s, size_type pos = 0) const
2051
+ { return find_first_of(s, pos, Traits::length(s)); }
2052
+
2053
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
2054
+ //!
2055
+ //! <b>Throws</b>: Nothing
2056
+ //!
2057
+ //! <b>Returns</b>: find_first_of(basic_string<CharT,traits,Allocator>(1,c), pos).
2058
+ size_type find_first_of(CharT c, size_type pos = 0) const
2059
+ { return find(c, pos); }
2060
+
2061
+ //! <b>Effects</b>: Determines the highest position xpos, if possible, such that both of
2062
+ //! the following conditions obtain: a) xpos <= pos and xpos < size(); b)
2063
+ //! traits::eq(at(xpos), str.at(I)) for some element I of the string controlled by str.
2064
+ //!
2065
+ //! <b>Throws</b>: Nothing
2066
+ //!
2067
+ //! <b>Returns</b>: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
2068
+ size_type find_last_of(const basic_string& str, size_type pos = npos) const
2069
+ { return find_last_of(str.c_str(), pos, str.size()); }
2070
+
2071
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
2072
+ //!
2073
+ //! <b>Throws</b>: Nothing
2074
+ //!
2075
+ //! <b>Returns</b>: find_last_of(basic_string(s, n), pos).
2076
+ size_type find_last_of(const CharT* s, size_type pos, size_type n) const
2077
+ {
2078
+ const size_type len = this->size();
2079
+
2080
+ if (len < 1)
2081
+ return npos;
2082
+ else {
2083
+ const pointer addr = this->priv_addr();
2084
+ const const_iterator last = addr + container_detail::min_value(len - 1, pos) + 1;
2085
+ const const_reverse_iterator rresult =
2086
+ std::find_first_of(const_reverse_iterator(last), rend(),
2087
+ s, s + n, Eq_traits<Traits>());
2088
+ return rresult != rend() ? (rresult.base() - 1) - addr : npos;
2089
+ }
2090
+ }
2091
+
2092
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
2093
+ //!
2094
+ //! <b>Throws</b>: Nothing
2095
+ //!
2096
+ //! <b>Returns</b>: find_last_of(basic_string<CharT,traits,Allocator>(1,c),pos).
2097
+ size_type find_last_of(const CharT* s, size_type pos = npos) const
2098
+ { return find_last_of(s, pos, Traits::length(s)); }
2099
+
2100
+ //! <b>Throws</b>: Nothing
2101
+ //!
2102
+ //! <b>Returns</b>: find_last_of(basic_string(s), pos).
2103
+ size_type find_last_of(CharT c, size_type pos = npos) const
2104
+ { return rfind(c, pos); }
2105
+
2106
+ //! <b>Effects</b>: Determines the lowest position xpos, if possible, such that
2107
+ //! both of the following conditions obtain:
2108
+ //! a) pos <= xpos and xpos < size(); b) traits::eq(at(xpos), str.at(I)) for no
2109
+ //! element I of the string controlled by str.
2110
+ //!
2111
+ //! <b>Throws</b>: Nothing
2112
+ //!
2113
+ //! <b>Returns</b>: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
2114
+ size_type find_first_not_of(const basic_string& str, size_type pos = 0) const
2115
+ { return find_first_not_of(str.c_str(), pos, str.size()); }
2116
+
2117
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
2118
+ //!
2119
+ //! <b>Throws</b>: Nothing
2120
+ //!
2121
+ //! <b>Returns</b>: find_first_not_of(basic_string(s, n), pos).
2122
+ size_type find_first_not_of(const CharT* s, size_type pos, size_type n) const
2123
+ {
2124
+ if (pos > this->size())
2125
+ return npos;
2126
+ else {
2127
+ const pointer addr = this->priv_addr();
2128
+ const pointer finish = addr + this->priv_size();
2129
+ const const_iterator result = std::find_if
2130
+ (addr + pos, finish, Not_within_traits<Traits>(s, s + n));
2131
+ return result != finish ? result - addr : npos;
2132
+ }
2133
+ }
2134
+
2135
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
2136
+ //!
2137
+ //! <b>Throws</b>: Nothing
2138
+ //!
2139
+ //! <b>Returns</b>: find_first_not_of(basic_string(s), pos).
2140
+ size_type find_first_not_of(const CharT* s, size_type pos = 0) const
2141
+ { return find_first_not_of(s, pos, Traits::length(s)); }
2142
+
2143
+ //! <b>Throws</b>: Nothing
2144
+ //!
2145
+ //! <b>Returns</b>: find_first_not_of(basic_string(1, c), pos).
2146
+ size_type find_first_not_of(CharT c, size_type pos = 0) const
2147
+ {
2148
+ if (pos > this->size())
2149
+ return npos;
2150
+ else {
2151
+ const pointer addr = this->priv_addr();
2152
+ const pointer finish = addr + this->priv_size();
2153
+ const const_iterator result
2154
+ = std::find_if(addr + pos, finish,
2155
+ std::not1(std::bind2nd(Eq_traits<Traits>(), c)));
2156
+ return result != finish ? result - begin() : npos;
2157
+ }
2158
+ }
2159
+
2160
+ //! <b>Effects</b>: Determines the highest position xpos, if possible, such that
2161
+ //! both of the following conditions obtain: a) xpos <= pos and xpos < size();
2162
+ //! b) traits::eq(at(xpos), str.at(I)) for no element I of the string controlled by str.
2163
+ //!
2164
+ //! <b>Throws</b>: Nothing
2165
+ //!
2166
+ //! <b>Returns</b>: xpos if the function can determine such a value for xpos. Otherwise, returns npos.
2167
+ size_type find_last_not_of(const basic_string& str, size_type pos = npos) const
2168
+ { return find_last_not_of(str.c_str(), pos, str.size()); }
2169
+
2170
+ //! <b>Requires</b>: s points to an array of at least n elements of CharT.
2171
+ //!
2172
+ //! <b>Throws</b>: Nothing
2173
+ //!
2174
+ //! <b>Returns</b>: find_last_not_of(basic_string(s, n), pos).
2175
+ size_type find_last_not_of(const CharT* s, size_type pos, size_type n) const
2176
+ {
2177
+ const size_type len = this->size();
2178
+
2179
+ if (len < 1)
2180
+ return npos;
2181
+ else {
2182
+ const const_iterator last = begin() + container_detail::min_value(len - 1, pos) + 1;
2183
+ const const_reverse_iterator rresult =
2184
+ std::find_if(const_reverse_iterator(last), rend(),
2185
+ Not_within_traits<Traits>(s, s + n));
2186
+ return rresult != rend() ? (rresult.base() - 1) - begin() : npos;
2187
+ }
2188
+ }
2189
+
2190
+ //! <b>Requires</b>: s points to an array of at least traits::length(s) + 1 elements of CharT.
2191
+ //!
2192
+ //! <b>Throws</b>: Nothing
2193
+ //!
2194
+ //! <b>Returns</b>: find_last_not_of(basic_string(s), pos).
2195
+ size_type find_last_not_of(const CharT* s, size_type pos = npos) const
2196
+ { return find_last_not_of(s, pos, Traits::length(s)); }
2197
+
2198
+ //! <b>Throws</b>: Nothing
2199
+ //!
2200
+ //! <b>Returns</b>: find_last_not_of(basic_string(1, c), pos).
2201
+ size_type find_last_not_of(CharT c, size_type pos = npos) const
2202
+ {
2203
+ const size_type len = this->size();
2204
+
2205
+ if (len < 1)
2206
+ return npos;
2207
+ else {
2208
+ const const_iterator last = begin() + container_detail::min_value(len - 1, pos) + 1;
2209
+ const const_reverse_iterator rresult =
2210
+ std::find_if(const_reverse_iterator(last), rend(),
2211
+ std::not1(std::bind2nd(Eq_traits<Traits>(), c)));
2212
+ return rresult != rend() ? (rresult.base() - 1) - begin() : npos;
2213
+ }
2214
+ }
2215
+
2216
+ //! <b>Requires</b>: Requires: pos <= size()
2217
+ //!
2218
+ //! <b>Effects</b>: Determines the effective length rlen of the string to copy as
2219
+ //! the smaller of n and size() - pos.
2220
+ //!
2221
+ //! <b>Throws</b>: If memory allocation throws or out_of_range if pos > size().
2222
+ //!
2223
+ //! <b>Returns</b>: basic_string<CharT,traits,Allocator>(data()+pos,rlen).
2224
+ basic_string substr(size_type pos = 0, size_type n = npos) const
2225
+ {
2226
+ if (pos > this->size())
2227
+ throw_out_of_range("basic_string::substr out of range position");
2228
+ const pointer addr = this->priv_addr();
2229
+ return basic_string(addr + pos,
2230
+ addr + pos + container_detail::min_value(n, size() - pos), this->alloc());
2231
+ }
2232
+
2233
+ //! <b>Effects</b>: Determines the effective length rlen of the string to copy as
2234
+ //! the smaller of size() and str.size(). The function then compares the two strings by
2235
+ //! calling traits::compare(data(), str.data(), rlen).
2236
+ //!
2237
+ //! <b>Throws</b>: Nothing
2238
+ //!
2239
+ //! <b>Returns</b>: The nonzero result if the result of the comparison is nonzero.
2240
+ //! Otherwise, returns a value < 0 if size() < str.size(), a 0 value if size() == str.size(),
2241
+ //! and value > 0 if size() > str.size()
2242
+ int compare(const basic_string& str) const
2243
+ {
2244
+ const pointer addr = this->priv_addr();
2245
+ const pointer str_addr = str.priv_addr();
2246
+ return s_compare(addr, addr + this->priv_size(), str_addr, str_addr + str.priv_size());
2247
+ }
2248
+
2249
+ //! <b>Requires</b>: pos1 <= size()
2250
+ //!
2251
+ //! <b>Effects</b>: Determines the effective length rlen of the string to copy as
2252
+ //! the smaller of
2253
+ //!
2254
+ //! <b>Throws</b>: out_of_range if pos1 > size()
2255
+ //!
2256
+ //! <b>Returns</b>:basic_string(*this,pos1,n1).compare(str).
2257
+ int compare(size_type pos1, size_type n1, const basic_string& str) const
2258
+ {
2259
+ if (pos1 > this->size())
2260
+ throw_out_of_range("basic_string::compare out of range position");
2261
+ const pointer addr = this->priv_addr();
2262
+ const pointer str_addr = str.priv_addr();
2263
+ return s_compare(addr + pos1,
2264
+ addr + pos1 + container_detail::min_value(n1, this->size() - pos1),
2265
+ str_addr, str_addr + str.priv_size());
2266
+ }
2267
+
2268
+ //! <b>Requires</b>: pos1 <= size() and pos2 <= str.size()
2269
+ //!
2270
+ //! <b>Effects</b>: Determines the effective length rlen of the string to copy as
2271
+ //! the smaller of
2272
+ //!
2273
+ //! <b>Throws</b>: out_of_range if pos1 > size() or pos2 > str.size()
2274
+ //!
2275
+ //! <b>Returns</b>: basic_string(*this, pos1, n1).compare(basic_string(str, pos2, n2)).
2276
+ int compare(size_type pos1, size_type n1, const basic_string& str, size_type pos2, size_type n2) const
2277
+ {
2278
+ if (pos1 > this->size() || pos2 > str.size())
2279
+ throw_out_of_range("basic_string::compare out of range position");
2280
+ const pointer addr = this->priv_addr();
2281
+ const pointer str_addr = str.priv_addr();
2282
+ return s_compare(addr + pos1,
2283
+ addr + pos1 + container_detail::min_value(n1, this->size() - pos1),
2284
+ str_addr + pos2,
2285
+ str_addr + pos2 + container_detail::min_value(n2, str.size() - pos2));
2286
+ }
2287
+
2288
+ //! <b>Throws</b>: Nothing
2289
+ //!
2290
+ //! <b>Returns</b>: compare(basic_string(s)).
2291
+ int compare(const CharT* s) const
2292
+ {
2293
+ const pointer addr = this->priv_addr();
2294
+ return s_compare(addr, addr + this->priv_size(), s, s + Traits::length(s));
2295
+ }
2296
+
2297
+
2298
+ //! <b>Requires</b>: pos1 > size() and s points to an array of at least n2 elements of CharT.
2299
+ //!
2300
+ //! <b>Throws</b>: out_of_range if pos1 > size()
2301
+ //!
2302
+ //! <b>Returns</b>: basic_string(*this, pos, n1).compare(basic_string(s, n2)).
2303
+ int compare(size_type pos1, size_type n1, const CharT* s, size_type n2) const
2304
+ {
2305
+ if (pos1 > this->size())
2306
+ throw_out_of_range("basic_string::compare out of range position");
2307
+ const pointer addr = this->priv_addr();
2308
+ return s_compare( addr + pos1,
2309
+ addr + pos1 + container_detail::min_value(n1, this->size() - pos1),
2310
+ s, s + n2);
2311
+ }
2312
+
2313
+ //! <b>Requires</b>: pos1 > size() and s points to an array of at least traits::length(s) + 1 elements of CharT.
2314
+ //!
2315
+ //! <b>Throws</b>: out_of_range if pos1 > size()
2316
+ //!
2317
+ //! <b>Returns</b>: basic_string(*this, pos, n1).compare(basic_string(s, n2)).
2318
+ int compare(size_type pos1, size_type n1, const CharT* s) const
2319
+ { return this->compare(pos1, n1, s, Traits::length(s)); }
2320
+
2321
+ /// @cond
2322
+ private:
2323
+ static int s_compare(const_pointer f1, const_pointer l1,
2324
+ const_pointer f2, const_pointer l2)
2325
+ {
2326
+ const difference_type n1 = l1 - f1;
2327
+ const difference_type n2 = l2 - f2;
2328
+ const int cmp = Traits::compare(container_detail::to_raw_pointer(f1),
2329
+ container_detail::to_raw_pointer(f2),
2330
+ container_detail::min_value(n1, n2));
2331
+ return cmp != 0 ? cmp : (n1 < n2 ? -1 : (n1 > n2 ? 1 : 0));
2332
+ }
2333
+
2334
+ template<class AllocVersion>
2335
+ void priv_shrink_to_fit_dynamic_buffer
2336
+ ( AllocVersion
2337
+ , typename container_detail::enable_if<container_detail::is_same<AllocVersion, allocator_v1> >::type* = 0)
2338
+ {
2339
+ //Allocate a new buffer.
2340
+ size_type real_cap = 0;
2341
+ const pointer long_addr = this->priv_long_addr();
2342
+ const size_type long_size = this->priv_long_size();
2343
+ const size_type long_storage = this->priv_long_storage();
2344
+ //We can make this nothrow as chars are always NoThrowCopyables
2345
+ BOOST_TRY{
2346
+ const std::pair<pointer, bool> ret = this->allocation_command
2347
+ (allocate_new, long_size+1, long_size+1, real_cap, long_addr);
2348
+ //Copy and update
2349
+ Traits::copy( container_detail::to_raw_pointer(ret.first)
2350
+ , container_detail::to_raw_pointer(this->priv_long_addr())
2351
+ , long_size+1);
2352
+ this->priv_long_addr(ret.first);
2353
+ this->priv_storage(real_cap);
2354
+ //And release old buffer
2355
+ this->alloc().deallocate(long_addr, long_storage);
2356
+ }
2357
+ BOOST_CATCH(...){
2358
+ return;
2359
+ }
2360
+ BOOST_CATCH_END
2361
+ }
2362
+
2363
+ template<class AllocVersion>
2364
+ void priv_shrink_to_fit_dynamic_buffer
2365
+ ( AllocVersion
2366
+ , typename container_detail::enable_if<container_detail::is_same<AllocVersion, allocator_v2> >::type* = 0)
2367
+ {
2368
+ size_type received_size;
2369
+ if(this->alloc().allocation_command
2370
+ ( shrink_in_place | nothrow_allocation
2371
+ , this->priv_long_storage(), this->priv_long_size()+1
2372
+ , received_size, this->priv_long_addr()).first){
2373
+ this->priv_storage(received_size);
2374
+ }
2375
+ }
2376
+
2377
+ void priv_construct_null(pointer p)
2378
+ { this->construct(p, CharT(0)); }
2379
+
2380
+ // Helper functions used by constructors. It is a severe error for
2381
+ // any of them to be called anywhere except from within constructors.
2382
+ void priv_terminate_string()
2383
+ { this->priv_construct_null(this->priv_end_addr()); }
2384
+
2385
+ template<class FwdIt, class Count> inline
2386
+ void priv_uninitialized_fill_n(FwdIt first, Count count, const CharT val)
2387
+ {
2388
+ //Save initial position
2389
+ FwdIt init = first;
2390
+
2391
+ BOOST_TRY{
2392
+ //Construct objects
2393
+ for (; count--; ++first){
2394
+ this->construct(first, val);
2395
+ }
2396
+ }
2397
+ BOOST_CATCH(...){
2398
+ //Call destructors
2399
+ for (; init != first; ++init){
2400
+ this->destroy(init);
2401
+ }
2402
+ BOOST_RETHROW
2403
+ }
2404
+ BOOST_CATCH_END
2405
+ }
2406
+
2407
+ template<class InpIt, class FwdIt> inline
2408
+ size_type priv_uninitialized_copy(InpIt first, InpIt last, FwdIt dest)
2409
+ {
2410
+ //Save initial destination position
2411
+ FwdIt dest_init = dest;
2412
+ size_type constructed = 0;
2413
+
2414
+ BOOST_TRY{
2415
+ //Try to build objects
2416
+ for (; first != last; ++dest, ++first, ++constructed){
2417
+ this->construct(dest, *first);
2418
+ }
2419
+ }
2420
+ BOOST_CATCH(...){
2421
+ //Call destructors
2422
+ for (; constructed--; ++dest_init){
2423
+ this->destroy(dest_init);
2424
+ }
2425
+ BOOST_RETHROW
2426
+ }
2427
+ BOOST_CATCH_END
2428
+ return (constructed);
2429
+ }
2430
+
2431
+ template <class InputIterator, class OutIterator>
2432
+ void priv_copy(InputIterator first, InputIterator last, OutIterator result)
2433
+ {
2434
+ for ( ; first != last; ++first, ++result)
2435
+ Traits::assign(*result, *first);
2436
+ }
2437
+
2438
+ void priv_copy(const CharT* first, const CharT* last, CharT* result)
2439
+ { Traits::copy(result, first, last - first); }
2440
+
2441
+ template <class Integer>
2442
+ basic_string& priv_replace_dispatch(const_iterator first, const_iterator last,
2443
+ Integer n, Integer x,
2444
+ container_detail::true_)
2445
+ { return this->replace(first, last, (size_type) n, (CharT) x); }
2446
+
2447
+ template <class InputIter>
2448
+ basic_string& priv_replace_dispatch(const_iterator first, const_iterator last,
2449
+ InputIter f, InputIter l,
2450
+ container_detail::false_)
2451
+ {
2452
+ typedef typename std::iterator_traits<InputIter>::iterator_category Category;
2453
+ return this->priv_replace(first, last, f, l, Category());
2454
+ }
2455
+
2456
+ /// @endcond
2457
+ };
2458
+
2459
+ //!Typedef for a basic_string of
2460
+ //!narrow characters
2461
+ typedef basic_string
2462
+ <char
2463
+ ,std::char_traits<char>
2464
+ ,std::allocator<char> >
2465
+ string;
2466
+
2467
+ //!Typedef for a basic_string of
2468
+ //!narrow characters
2469
+ typedef basic_string
2470
+ <wchar_t
2471
+ ,std::char_traits<wchar_t>
2472
+ ,std::allocator<wchar_t> >
2473
+ wstring;
2474
+
2475
+ // ------------------------------------------------------------
2476
+ // Non-member functions.
2477
+
2478
+ // Operator+
2479
+
2480
+ template <class CharT, class Traits, class Allocator> inline
2481
+ basic_string<CharT,Traits,Allocator>
2482
+ operator+(const basic_string<CharT,Traits,Allocator>& x
2483
+ ,const basic_string<CharT,Traits,Allocator>& y)
2484
+ {
2485
+ typedef basic_string<CharT,Traits,Allocator> str_t;
2486
+ typedef typename str_t::reserve_t reserve_t;
2487
+ reserve_t reserve;
2488
+ str_t result(reserve, x.size() + y.size(), x.get_stored_allocator());
2489
+ result.append(x);
2490
+ result.append(y);
2491
+ return result;
2492
+ }
2493
+
2494
+ template <class CharT, class Traits, class Allocator> inline
2495
+ basic_string<CharT, Traits, Allocator> operator+
2496
+ ( BOOST_RV_REF_BEG basic_string<CharT, Traits, Allocator> BOOST_RV_REF_END mx
2497
+ , BOOST_RV_REF_BEG basic_string<CharT, Traits, Allocator> BOOST_RV_REF_END my)
2498
+ {
2499
+ mx += my;
2500
+ return boost::move(mx);
2501
+ }
2502
+
2503
+ template <class CharT, class Traits, class Allocator> inline
2504
+ basic_string<CharT, Traits, Allocator> operator+
2505
+ ( BOOST_RV_REF_BEG basic_string<CharT, Traits, Allocator> BOOST_RV_REF_END mx
2506
+ , const basic_string<CharT,Traits,Allocator>& y)
2507
+ {
2508
+ mx += y;
2509
+ return boost::move(mx);
2510
+ }
2511
+
2512
+ template <class CharT, class Traits, class Allocator> inline
2513
+ basic_string<CharT, Traits, Allocator> operator+
2514
+ (const basic_string<CharT,Traits,Allocator>& x
2515
+ ,BOOST_RV_REF_BEG basic_string<CharT, Traits, Allocator> BOOST_RV_REF_END my)
2516
+ {
2517
+ my.insert(my.begin(), x.begin(), x.end());
2518
+ return boost::move(my);
2519
+ }
2520
+
2521
+ template <class CharT, class Traits, class Allocator> inline
2522
+ basic_string<CharT, Traits, Allocator> operator+
2523
+ (const CharT* s, basic_string<CharT, Traits, Allocator> y)
2524
+ {
2525
+ y.insert(y.begin(), s, s + Traits::length(s));
2526
+ return y;
2527
+ }
2528
+
2529
+ template <class CharT, class Traits, class Allocator> inline
2530
+ basic_string<CharT,Traits,Allocator> operator+
2531
+ (basic_string<CharT,Traits,Allocator> x, const CharT* s)
2532
+ {
2533
+ x += s;
2534
+ return x;
2535
+ }
2536
+
2537
+ template <class CharT, class Traits, class Allocator> inline
2538
+ basic_string<CharT,Traits,Allocator> operator+
2539
+ (CharT c, basic_string<CharT,Traits,Allocator> y)
2540
+ {
2541
+ y.insert(y.begin(), c);
2542
+ return y;
2543
+ }
2544
+
2545
+ template <class CharT, class Traits, class Allocator> inline
2546
+ basic_string<CharT,Traits,Allocator> operator+
2547
+ (basic_string<CharT,Traits,Allocator> x, const CharT c)
2548
+ {
2549
+ x += c;
2550
+ return x;
2551
+ }
2552
+
2553
+ // Operator== and operator!=
2554
+
2555
+ template <class CharT, class Traits, class Allocator>
2556
+ inline bool
2557
+ operator==(const basic_string<CharT,Traits,Allocator>& x,
2558
+ const basic_string<CharT,Traits,Allocator>& y)
2559
+ {
2560
+ return x.size() == y.size() &&
2561
+ Traits::compare(x.data(), y.data(), x.size()) == 0;
2562
+ }
2563
+
2564
+ template <class CharT, class Traits, class Allocator>
2565
+ inline bool
2566
+ operator==(const CharT* s, const basic_string<CharT,Traits,Allocator>& y)
2567
+ {
2568
+ typename basic_string<CharT,Traits,Allocator>::size_type n = Traits::length(s);
2569
+ return n == y.size() && Traits::compare(s, y.data(), n) == 0;
2570
+ }
2571
+
2572
+ template <class CharT, class Traits, class Allocator>
2573
+ inline bool
2574
+ operator==(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
2575
+ {
2576
+ typename basic_string<CharT,Traits,Allocator>::size_type n = Traits::length(s);
2577
+ return x.size() == n && Traits::compare(x.data(), s, n) == 0;
2578
+ }
2579
+
2580
+ template <class CharT, class Traits, class Allocator>
2581
+ inline bool
2582
+ operator!=(const basic_string<CharT,Traits,Allocator>& x,
2583
+ const basic_string<CharT,Traits,Allocator>& y)
2584
+ { return !(x == y); }
2585
+
2586
+ template <class CharT, class Traits, class Allocator>
2587
+ inline bool
2588
+ operator!=(const CharT* s, const basic_string<CharT,Traits,Allocator>& y)
2589
+ { return !(s == y); }
2590
+
2591
+ template <class CharT, class Traits, class Allocator>
2592
+ inline bool
2593
+ operator!=(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
2594
+ { return !(x == s); }
2595
+
2596
+
2597
+ // Operator< (and also >, <=, and >=).
2598
+
2599
+ template <class CharT, class Traits, class Allocator>
2600
+ inline bool
2601
+ operator<(const basic_string<CharT,Traits,Allocator>& x, const basic_string<CharT,Traits,Allocator>& y)
2602
+ {
2603
+ return x.compare(y) < 0;
2604
+ // return basic_string<CharT,Traits,Allocator>
2605
+ // ::s_compare(x.begin(), x.end(), y.begin(), y.end()) < 0;
2606
+ }
2607
+
2608
+ template <class CharT, class Traits, class Allocator>
2609
+ inline bool
2610
+ operator<(const CharT* s, const basic_string<CharT,Traits,Allocator>& y)
2611
+ {
2612
+ return y.compare(s) > 0;
2613
+ // basic_string<CharT,Traits,Allocator>::size_type n = Traits::length(s);
2614
+ // return basic_string<CharT,Traits,Allocator>
2615
+ // ::s_compare(s, s + n, y.begin(), y.end()) < 0;
2616
+ }
2617
+
2618
+ template <class CharT, class Traits, class Allocator>
2619
+ inline bool
2620
+ operator<(const basic_string<CharT,Traits,Allocator>& x,
2621
+ const CharT* s)
2622
+ {
2623
+ return x.compare(s) < 0;
2624
+ // basic_string<CharT,Traits,Allocator>::size_type n = Traits::length(s);
2625
+ // return basic_string<CharT,Traits,Allocator>
2626
+ // ::s_compare(x.begin(), x.end(), s, s + n) < 0;
2627
+ }
2628
+
2629
+ template <class CharT, class Traits, class Allocator>
2630
+ inline bool
2631
+ operator>(const basic_string<CharT,Traits,Allocator>& x,
2632
+ const basic_string<CharT,Traits,Allocator>& y) {
2633
+ return y < x;
2634
+ }
2635
+
2636
+ template <class CharT, class Traits, class Allocator>
2637
+ inline bool
2638
+ operator>(const CharT* s, const basic_string<CharT,Traits,Allocator>& y) {
2639
+ return y < s;
2640
+ }
2641
+
2642
+ template <class CharT, class Traits, class Allocator>
2643
+ inline bool
2644
+ operator>(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
2645
+ {
2646
+ return s < x;
2647
+ }
2648
+
2649
+ template <class CharT, class Traits, class Allocator>
2650
+ inline bool
2651
+ operator<=(const basic_string<CharT,Traits,Allocator>& x,
2652
+ const basic_string<CharT,Traits,Allocator>& y)
2653
+ {
2654
+ return !(y < x);
2655
+ }
2656
+
2657
+ template <class CharT, class Traits, class Allocator>
2658
+ inline bool
2659
+ operator<=(const CharT* s, const basic_string<CharT,Traits,Allocator>& y)
2660
+ { return !(y < s); }
2661
+
2662
+ template <class CharT, class Traits, class Allocator>
2663
+ inline bool
2664
+ operator<=(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
2665
+ { return !(s < x); }
2666
+
2667
+ template <class CharT, class Traits, class Allocator>
2668
+ inline bool
2669
+ operator>=(const basic_string<CharT,Traits,Allocator>& x,
2670
+ const basic_string<CharT,Traits,Allocator>& y)
2671
+ { return !(x < y); }
2672
+
2673
+ template <class CharT, class Traits, class Allocator>
2674
+ inline bool
2675
+ operator>=(const CharT* s, const basic_string<CharT,Traits,Allocator>& y)
2676
+ { return !(s < y); }
2677
+
2678
+ template <class CharT, class Traits, class Allocator>
2679
+ inline bool
2680
+ operator>=(const basic_string<CharT,Traits,Allocator>& x, const CharT* s)
2681
+ { return !(x < s); }
2682
+
2683
+ // Swap.
2684
+ template <class CharT, class Traits, class Allocator>
2685
+ inline void swap(basic_string<CharT,Traits,Allocator>& x, basic_string<CharT,Traits,Allocator>& y)
2686
+ { x.swap(y); }
2687
+
2688
+ /// @cond
2689
+ // I/O.
2690
+ namespace container_detail {
2691
+
2692
+ template <class CharT, class Traits>
2693
+ inline bool
2694
+ string_fill(std::basic_ostream<CharT, Traits>& os,
2695
+ std::basic_streambuf<CharT, Traits>* buf,
2696
+ std::size_t n)
2697
+ {
2698
+ CharT f = os.fill();
2699
+ std::size_t i;
2700
+ bool ok = true;
2701
+
2702
+ for (i = 0; i < n; i++)
2703
+ ok = ok && !Traits::eq_int_type(buf->sputc(f), Traits::eof());
2704
+ return ok;
2705
+ }
2706
+
2707
+ } //namespace container_detail {
2708
+ /// @endcond
2709
+
2710
+ template <class CharT, class Traits, class Allocator>
2711
+ std::basic_ostream<CharT, Traits>&
2712
+ operator<<(std::basic_ostream<CharT, Traits>& os, const basic_string<CharT,Traits,Allocator>& s)
2713
+ {
2714
+ typename std::basic_ostream<CharT, Traits>::sentry sentry(os);
2715
+ bool ok = false;
2716
+
2717
+ if (sentry) {
2718
+ ok = true;
2719
+ typename basic_string<CharT,Traits,Allocator>::size_type n = s.size();
2720
+ typename basic_string<CharT,Traits,Allocator>::size_type pad_len = 0;
2721
+ const bool left = (os.flags() & std::ios::left) != 0;
2722
+ const std::size_t w = os.width(0);
2723
+ std::basic_streambuf<CharT, Traits>* buf = os.rdbuf();
2724
+
2725
+ if (w != 0 && n < w)
2726
+ pad_len = w - n;
2727
+
2728
+ if (!left)
2729
+ ok = container_detail::string_fill(os, buf, pad_len);
2730
+
2731
+ ok = ok &&
2732
+ buf->sputn(s.data(), std::streamsize(n)) == std::streamsize(n);
2733
+
2734
+ if (left)
2735
+ ok = ok && container_detail::string_fill(os, buf, pad_len);
2736
+ }
2737
+
2738
+ if (!ok)
2739
+ os.setstate(std::ios_base::failbit);
2740
+
2741
+ return os;
2742
+ }
2743
+
2744
+
2745
+ template <class CharT, class Traits, class Allocator>
2746
+ std::basic_istream<CharT, Traits>&
2747
+ operator>>(std::basic_istream<CharT, Traits>& is, basic_string<CharT,Traits,Allocator>& s)
2748
+ {
2749
+ typename std::basic_istream<CharT, Traits>::sentry sentry(is);
2750
+
2751
+ if (sentry) {
2752
+ std::basic_streambuf<CharT, Traits>* buf = is.rdbuf();
2753
+ const std::ctype<CharT>& ctype = std::use_facet<std::ctype<CharT> >(is.getloc());
2754
+
2755
+ s.clear();
2756
+ std::size_t n = is.width(0);
2757
+ if (n == 0)
2758
+ n = static_cast<std::size_t>(-1);
2759
+ else
2760
+ s.reserve(n);
2761
+
2762
+ while (n-- > 0) {
2763
+ typename Traits::int_type c1 = buf->sbumpc();
2764
+
2765
+ if (Traits::eq_int_type(c1, Traits::eof())) {
2766
+ is.setstate(std::ios_base::eofbit);
2767
+ break;
2768
+ }
2769
+ else {
2770
+ CharT c = Traits::to_char_type(c1);
2771
+
2772
+ if (ctype.is(std::ctype<CharT>::space, c)) {
2773
+ if (Traits::eq_int_type(buf->sputbackc(c), Traits::eof()))
2774
+ is.setstate(std::ios_base::failbit);
2775
+ break;
2776
+ }
2777
+ else
2778
+ s.push_back(c);
2779
+ }
2780
+ }
2781
+
2782
+ // If we have read no characters, then set failbit.
2783
+ if (s.size() == 0)
2784
+ is.setstate(std::ios_base::failbit);
2785
+ }
2786
+ else
2787
+ is.setstate(std::ios_base::failbit);
2788
+
2789
+ return is;
2790
+ }
2791
+
2792
+ template <class CharT, class Traits, class Allocator>
2793
+ std::basic_istream<CharT, Traits>&
2794
+ getline(std::istream& is, basic_string<CharT,Traits,Allocator>& s,CharT delim)
2795
+ {
2796
+ typename basic_string<CharT,Traits,Allocator>::size_type nread = 0;
2797
+ typename std::basic_istream<CharT, Traits>::sentry sentry(is, true);
2798
+ if (sentry) {
2799
+ std::basic_streambuf<CharT, Traits>* buf = is.rdbuf();
2800
+ s.clear();
2801
+
2802
+ while (nread < s.max_size()) {
2803
+ int c1 = buf->sbumpc();
2804
+ if (Traits::eq_int_type(c1, Traits::eof())) {
2805
+ is.setstate(std::ios_base::eofbit);
2806
+ break;
2807
+ }
2808
+ else {
2809
+ ++nread;
2810
+ CharT c = Traits::to_char_type(c1);
2811
+ if (!Traits::eq(c, delim))
2812
+ s.push_back(c);
2813
+ else
2814
+ break; // Character is extracted but not appended.
2815
+ }
2816
+ }
2817
+ }
2818
+ if (nread == 0 || nread >= s.max_size())
2819
+ is.setstate(std::ios_base::failbit);
2820
+
2821
+ return is;
2822
+ }
2823
+
2824
+ template <class CharT, class Traits, class Allocator>
2825
+ inline std::basic_istream<CharT, Traits>&
2826
+ getline(std::basic_istream<CharT, Traits>& is, basic_string<CharT,Traits,Allocator>& s)
2827
+ {
2828
+ return getline(is, s, '\n');
2829
+ }
2830
+
2831
+ template <class Ch, class Allocator>
2832
+ inline std::size_t hash_value(basic_string<Ch, std::char_traits<Ch>, Allocator> const& v)
2833
+ {
2834
+ return hash_range(v.begin(), v.end());
2835
+ }
2836
+
2837
+ }}
2838
+
2839
+ /// @cond
2840
+
2841
+ namespace boost {
2842
+
2843
+ //!has_trivial_destructor_after_move<> == true_type
2844
+ //!specialization for optimizations
2845
+ template <class C, class T, class Allocator>
2846
+ struct has_trivial_destructor_after_move<boost::container::basic_string<C, T, Allocator> >
2847
+ : public ::boost::has_trivial_destructor_after_move<Allocator>
2848
+ {};
2849
+
2850
+ }
2851
+
2852
+ /// @endcond
2853
+
2854
+ #include <boost/container/detail/config_end.hpp>
2855
+
2856
+ #endif // BOOST_CONTAINER_STRING_HPP