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,110 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Ion Gaztanaga 2012-2013. 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
+
11
+ #ifndef BOOST_CONTAINER_THROW_EXCEPTION_HPP
12
+ #define BOOST_CONTAINER_THROW_EXCEPTION_HPP
13
+
14
+ #include <boost/container/detail/config_begin.hpp>
15
+ #include <boost/container/detail/workaround.hpp>
16
+
17
+ #if (defined _MSC_VER) && (_MSC_VER >= 1200)
18
+ # pragma once
19
+ #endif
20
+
21
+ #ifndef BOOST_NO_EXCEPTIONS
22
+ #include <stdexcept> //for std exception types
23
+ #include <new> //for std::bad_alloc
24
+ #else
25
+ #include <boost/assert.hpp>
26
+ #include <cstdlib> //for std::abort
27
+ #endif
28
+
29
+ namespace boost {
30
+ namespace container {
31
+
32
+ #if defined(BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS)
33
+ //The user must provide definitions for the following functions
34
+
35
+ void throw_bad_alloc();
36
+
37
+ void throw_out_of_range(const char* str);
38
+
39
+ void throw_length_error(const char* str);
40
+
41
+ void throw_logic_error(const char* str);
42
+
43
+ void throw_runtime_error(const char* str);
44
+
45
+ #elif defined(BOOST_NO_EXCEPTIONS)
46
+
47
+ inline void throw_bad_alloc()
48
+ {
49
+ BOOST_ASSERT(!"boost::container bad_alloc thrown");
50
+ std::abort();
51
+ }
52
+
53
+ inline void throw_out_of_range(const char* str)
54
+ {
55
+ BOOST_ASSERT_MSG(!"boost::container out_of_range thrown", str);
56
+ std::abort();
57
+ }
58
+
59
+ inline void throw_length_error(const char* str)
60
+ {
61
+ BOOST_ASSERT_MSG(!"boost::container length_error thrown", str);
62
+ std::abort();
63
+ }
64
+
65
+ inline void throw_logic_error(const char* str)
66
+ {
67
+ BOOST_ASSERT_MSG(!"boost::container logic_error thrown", str);
68
+ std::abort();
69
+ }
70
+
71
+ inline void throw_runtime_error(const char* str)
72
+ {
73
+ BOOST_ASSERT_MSG(!"boost::container runtime_error thrown", str);
74
+ std::abort();
75
+ }
76
+
77
+ #else //defined(BOOST_NO_EXCEPTIONS)
78
+
79
+ inline void throw_bad_alloc()
80
+ {
81
+ throw std::bad_alloc();
82
+ }
83
+
84
+ inline void throw_out_of_range(const char* str)
85
+ {
86
+ throw std::out_of_range(str);
87
+ }
88
+
89
+ inline void throw_length_error(const char* str)
90
+ {
91
+ throw std::length_error(str);
92
+ }
93
+
94
+ inline void throw_logic_error(const char* str)
95
+ {
96
+ throw std::logic_error(str);
97
+ }
98
+
99
+ inline void throw_runtime_error(const char* str)
100
+ {
101
+ throw std::runtime_error(str);
102
+ }
103
+
104
+ #endif
105
+
106
+ }} //namespace boost { namespace container {
107
+
108
+ #include <boost/container/detail/config_end.hpp>
109
+
110
+ #endif //#ifndef BOOST_CONTAINER_THROW_EXCEPTION_HPP
@@ -0,0 +1,2671 @@
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
+
11
+ #ifndef BOOST_CONTAINER_CONTAINER_VECTOR_HPP
12
+ #define BOOST_CONTAINER_CONTAINER_VECTOR_HPP
13
+
14
+ #if (defined _MSC_VER) && (_MSC_VER >= 1200)
15
+ # pragma once
16
+ #endif
17
+
18
+ #include <boost/container/detail/config_begin.hpp>
19
+ #include <boost/container/detail/workaround.hpp>
20
+ #include <boost/container/container_fwd.hpp>
21
+
22
+ #include <cstddef>
23
+ #include <memory>
24
+ #include <algorithm>
25
+ #include <iterator>
26
+ #include <utility>
27
+ #include <boost/detail/no_exceptions_support.hpp>
28
+ #include <boost/type_traits/has_trivial_destructor.hpp>
29
+ #include <boost/type_traits/has_trivial_copy.hpp>
30
+ #include <boost/type_traits/has_trivial_assign.hpp>
31
+ #include <boost/type_traits/has_nothrow_copy.hpp>
32
+ #include <boost/type_traits/has_nothrow_assign.hpp>
33
+ #include <boost/type_traits/has_nothrow_constructor.hpp>
34
+ #include <boost/container/container_fwd.hpp>
35
+ #include <boost/container/detail/version_type.hpp>
36
+ #include <boost/container/detail/allocation_type.hpp>
37
+ #include <boost/container/detail/utilities.hpp>
38
+ #include <boost/container/detail/iterators.hpp>
39
+ #include <boost/container/detail/algorithms.hpp>
40
+ #include <boost/container/detail/destroyers.hpp>
41
+ #include <boost/container/allocator_traits.hpp>
42
+ #include <boost/container/detail/allocator_version_traits.hpp>
43
+ #include <boost/container/throw_exception.hpp>
44
+ #include <boost/move/utility.hpp>
45
+ #include <boost/move/iterator.hpp>
46
+ #include <boost/move/detail/move_helpers.hpp>
47
+ #include <boost/intrusive/pointer_traits.hpp>
48
+ #include <boost/container/detail/mpl.hpp>
49
+ #include <boost/container/detail/type_traits.hpp>
50
+ #include <boost/container/detail/advanced_insert_int.hpp>
51
+ #include <boost/assert.hpp>
52
+
53
+ namespace boost {
54
+ namespace container {
55
+
56
+ /// @cond
57
+
58
+ //#define BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
59
+
60
+ namespace container_detail {
61
+
62
+ #ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
63
+
64
+ //! Const vector_iterator used to iterate through a vector.
65
+ template <class Pointer>
66
+ class vector_const_iterator
67
+ {
68
+ public:
69
+ typedef std::random_access_iterator_tag iterator_category;
70
+ typedef typename boost::intrusive::pointer_traits<Pointer>::element_type value_type;
71
+ typedef typename boost::intrusive::pointer_traits<Pointer>::difference_type difference_type;
72
+ typedef typename boost::intrusive::pointer_traits<Pointer>::template
73
+ rebind_pointer<const value_type>::type pointer;
74
+ typedef const value_type& reference;
75
+
76
+ /// @cond
77
+ protected:
78
+ Pointer m_ptr;
79
+
80
+ public:
81
+ const Pointer &get_ptr() const BOOST_CONTAINER_NOEXCEPT
82
+ { return m_ptr; }
83
+
84
+ Pointer &get_ptr() BOOST_CONTAINER_NOEXCEPT
85
+ { return m_ptr; }
86
+
87
+ explicit vector_const_iterator(Pointer ptr) BOOST_CONTAINER_NOEXCEPT
88
+ : m_ptr(ptr)
89
+ {}
90
+ /// @endcond
91
+
92
+ public:
93
+
94
+ //Constructors
95
+ vector_const_iterator() BOOST_CONTAINER_NOEXCEPT
96
+ #ifndef NDEBUG
97
+ : m_ptr()
98
+ #else
99
+ // No value initialization of m_ptr() to speed up things a bit:
100
+ #endif
101
+ {}
102
+
103
+ //Pointer like operators
104
+ reference operator*() const BOOST_CONTAINER_NOEXCEPT
105
+ { return *m_ptr; }
106
+
107
+ const value_type * operator->() const BOOST_CONTAINER_NOEXCEPT
108
+ { return container_detail::to_raw_pointer(m_ptr); }
109
+
110
+ reference operator[](difference_type off) const BOOST_CONTAINER_NOEXCEPT
111
+ { return m_ptr[off]; }
112
+
113
+ //Increment / Decrement
114
+ vector_const_iterator& operator++() BOOST_CONTAINER_NOEXCEPT
115
+ { ++m_ptr; return *this; }
116
+
117
+ vector_const_iterator operator++(int) BOOST_CONTAINER_NOEXCEPT
118
+ { return vector_const_iterator(m_ptr++); }
119
+
120
+ vector_const_iterator& operator--() BOOST_CONTAINER_NOEXCEPT
121
+ { --m_ptr; return *this; }
122
+
123
+ vector_const_iterator operator--(int) BOOST_CONTAINER_NOEXCEPT
124
+ { return vector_const_iterator(m_ptr--); }
125
+
126
+ //Arithmetic
127
+ vector_const_iterator& operator+=(difference_type off) BOOST_CONTAINER_NOEXCEPT
128
+ { m_ptr += off; return *this; }
129
+
130
+ vector_const_iterator& operator-=(difference_type off) BOOST_CONTAINER_NOEXCEPT
131
+ { m_ptr -= off; return *this; }
132
+
133
+ friend vector_const_iterator operator+(const vector_const_iterator &x, difference_type off) BOOST_CONTAINER_NOEXCEPT
134
+ { return vector_const_iterator(x.m_ptr+off); }
135
+
136
+ friend vector_const_iterator operator+(difference_type off, vector_const_iterator right) BOOST_CONTAINER_NOEXCEPT
137
+ { right.m_ptr += off; return right; }
138
+
139
+ friend vector_const_iterator operator-(vector_const_iterator left, difference_type off) BOOST_CONTAINER_NOEXCEPT
140
+ { left.m_ptr -= off; return left; }
141
+
142
+ friend difference_type operator-(const vector_const_iterator &left, const vector_const_iterator& right) BOOST_CONTAINER_NOEXCEPT
143
+ { return left.m_ptr - right.m_ptr; }
144
+
145
+ //Comparison operators
146
+ friend bool operator== (const vector_const_iterator& l, const vector_const_iterator& r) BOOST_CONTAINER_NOEXCEPT
147
+ { return l.m_ptr == r.m_ptr; }
148
+
149
+ friend bool operator!= (const vector_const_iterator& l, const vector_const_iterator& r) BOOST_CONTAINER_NOEXCEPT
150
+ { return l.m_ptr != r.m_ptr; }
151
+
152
+ friend bool operator< (const vector_const_iterator& l, const vector_const_iterator& r) BOOST_CONTAINER_NOEXCEPT
153
+ { return l.m_ptr < r.m_ptr; }
154
+
155
+ friend bool operator<= (const vector_const_iterator& l, const vector_const_iterator& r) BOOST_CONTAINER_NOEXCEPT
156
+ { return l.m_ptr <= r.m_ptr; }
157
+
158
+ friend bool operator> (const vector_const_iterator& l, const vector_const_iterator& r) BOOST_CONTAINER_NOEXCEPT
159
+ { return l.m_ptr > r.m_ptr; }
160
+
161
+ friend bool operator>= (const vector_const_iterator& l, const vector_const_iterator& r) BOOST_CONTAINER_NOEXCEPT
162
+ { return l.m_ptr >= r.m_ptr; }
163
+ };
164
+
165
+ //! Iterator used to iterate through a vector
166
+ template <class Pointer>
167
+ class vector_iterator
168
+ : public vector_const_iterator<Pointer>
169
+ {
170
+ typedef vector_const_iterator<Pointer> base_t;
171
+ public:
172
+ explicit vector_iterator(Pointer ptr) BOOST_CONTAINER_NOEXCEPT
173
+ : base_t(ptr)
174
+ {}
175
+
176
+ public:
177
+ typedef std::random_access_iterator_tag iterator_category;
178
+ typedef typename boost::intrusive::pointer_traits<Pointer>::element_type value_type;
179
+ typedef typename boost::intrusive::pointer_traits<Pointer>::difference_type difference_type;
180
+ typedef Pointer pointer;
181
+ typedef value_type& reference;
182
+
183
+ //Constructors
184
+ vector_iterator() BOOST_CONTAINER_NOEXCEPT
185
+ : base_t()
186
+ {}
187
+
188
+ //Pointer like operators
189
+ reference operator*() const BOOST_CONTAINER_NOEXCEPT
190
+ { return *this->m_ptr; }
191
+
192
+ value_type* operator->() const BOOST_CONTAINER_NOEXCEPT
193
+ { return container_detail::to_raw_pointer(this->m_ptr); }
194
+
195
+ reference operator[](difference_type off) const BOOST_CONTAINER_NOEXCEPT
196
+ { return this->m_ptr[off]; }
197
+
198
+ //Increment / Decrement
199
+ vector_iterator& operator++() BOOST_CONTAINER_NOEXCEPT
200
+ { ++this->m_ptr; return *this; }
201
+
202
+ vector_iterator operator++(int) BOOST_CONTAINER_NOEXCEPT
203
+ { return vector_iterator(this->m_ptr++); }
204
+
205
+ vector_iterator& operator--() BOOST_CONTAINER_NOEXCEPT
206
+ { --this->m_ptr; return *this; }
207
+
208
+ vector_iterator operator--(int) BOOST_CONTAINER_NOEXCEPT
209
+ { return vector_iterator(this->m_ptr--); }
210
+
211
+ // Arithmetic
212
+ vector_iterator& operator+=(difference_type off) BOOST_CONTAINER_NOEXCEPT
213
+ { this->m_ptr += off; return *this; }
214
+
215
+ vector_iterator& operator-=(difference_type off) BOOST_CONTAINER_NOEXCEPT
216
+ { this->m_ptr -= off; return *this; }
217
+
218
+ friend vector_iterator operator+(vector_iterator left, difference_type off) BOOST_CONTAINER_NOEXCEPT
219
+ { left.m_ptr += off; return left; }
220
+
221
+ friend vector_iterator operator+(difference_type off, vector_iterator right) BOOST_CONTAINER_NOEXCEPT
222
+ { right.m_ptr += off; return right; }
223
+
224
+ friend vector_iterator operator-(vector_iterator left, difference_type off) BOOST_CONTAINER_NOEXCEPT
225
+ { left.m_ptr -= off; return left; }
226
+ };
227
+
228
+ } //namespace container_detail {
229
+
230
+ template<class Pointer>
231
+ const Pointer &vector_iterator_get_ptr(const container_detail::vector_const_iterator<Pointer> &it) BOOST_CONTAINER_NOEXCEPT
232
+ { return it.get_ptr(); }
233
+
234
+ template<class Pointer>
235
+ Pointer &get_ptr(container_detail::vector_const_iterator<Pointer> &it) BOOST_CONTAINER_NOEXCEPT
236
+ { return it.get_ptr(); }
237
+
238
+ namespace container_detail {
239
+
240
+ #else //ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
241
+
242
+ template< class MaybeConstPointer
243
+ , bool ElementTypeIsConst
244
+ = is_const< typename boost::intrusive::pointer_traits<MaybeConstPointer>::element_type>::value >
245
+ struct vector_get_ptr_pointer_to_non_const
246
+ {
247
+ typedef MaybeConstPointer const_pointer;
248
+ typedef boost::intrusive::pointer_traits<const_pointer> pointer_traits_t;
249
+ typedef typename pointer_traits_t::element_type element_type;
250
+ typedef typename remove_const<element_type>::type non_const_element_type;
251
+ typedef typename pointer_traits_t
252
+ ::template rebind_pointer<non_const_element_type>::type return_type;
253
+
254
+ static return_type get_ptr(const const_pointer &ptr)
255
+ { return boost::intrusive::pointer_traits<return_type>::const_cast_from(ptr); }
256
+ };
257
+
258
+ template<class Pointer>
259
+ struct vector_get_ptr_pointer_to_non_const<Pointer, false>
260
+ {
261
+ typedef const Pointer & return_type;
262
+ static return_type get_ptr(const Pointer &ptr)
263
+ { return ptr; }
264
+ };
265
+
266
+ } //namespace container_detail {
267
+
268
+ template<class MaybeConstPointer>
269
+ typename container_detail::vector_get_ptr_pointer_to_non_const<MaybeConstPointer>::return_type
270
+ vector_iterator_get_ptr(const MaybeConstPointer &ptr) BOOST_CONTAINER_NOEXCEPT
271
+ {
272
+ return container_detail::vector_get_ptr_pointer_to_non_const<MaybeConstPointer>::get_ptr(ptr);
273
+ }
274
+
275
+ namespace container_detail {
276
+
277
+ #endif //#ifndef BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER
278
+
279
+ template <class T, class Allocator>
280
+ struct vector_value_traits
281
+ {
282
+ typedef T value_type;
283
+ typedef Allocator allocator_type;
284
+ static const bool trivial_dctr = boost::has_trivial_destructor<value_type>::value;
285
+ static const bool trivial_dctr_after_move = ::boost::has_trivial_destructor_after_move<value_type>::value;
286
+ static const bool trivial_copy = has_trivial_copy<value_type>::value;
287
+ static const bool nothrow_copy = has_nothrow_copy<value_type>::value || trivial_copy;
288
+ static const bool trivial_assign = has_trivial_assign<value_type>::value;
289
+ static const bool nothrow_assign = has_nothrow_assign<value_type>::value || trivial_assign;
290
+
291
+ //This is the anti-exception array destructor
292
+ //to deallocate values already constructed
293
+ typedef typename container_detail::if_c
294
+ <trivial_dctr
295
+ ,container_detail::null_scoped_destructor_n<Allocator>
296
+ ,container_detail::scoped_destructor_n<Allocator>
297
+ >::type OldArrayDestructor;
298
+ //This is the anti-exception array destructor
299
+ //to destroy objects created with copy construction
300
+ typedef typename container_detail::if_c
301
+ <nothrow_copy
302
+ ,container_detail::null_scoped_destructor_n<Allocator>
303
+ ,container_detail::scoped_destructor_n<Allocator>
304
+ >::type ArrayDestructor;
305
+ //This is the anti-exception array deallocator
306
+ typedef typename container_detail::if_c
307
+ <nothrow_copy
308
+ ,container_detail::null_scoped_array_deallocator<Allocator>
309
+ ,container_detail::scoped_array_deallocator<Allocator>
310
+ >::type ArrayDeallocator;
311
+ };
312
+
313
+ //!This struct deallocates and allocated memory
314
+ template < class Allocator
315
+ , class AllocatorVersion = container_detail::integral_constant
316
+ < unsigned
317
+ , boost::container::container_detail::version<Allocator>::value
318
+ >
319
+ >
320
+ struct vector_alloc_holder
321
+ : public Allocator
322
+ {
323
+ private:
324
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(vector_alloc_holder)
325
+
326
+ public:
327
+ typedef boost::container::allocator_traits<Allocator> allocator_traits_type;
328
+ typedef typename allocator_traits_type::pointer pointer;
329
+ typedef typename allocator_traits_type::size_type size_type;
330
+ typedef typename allocator_traits_type::value_type value_type;
331
+
332
+ //Constructor, does not throw
333
+ vector_alloc_holder()
334
+ BOOST_CONTAINER_NOEXCEPT_IF(::boost::has_nothrow_default_constructor<Allocator>::value)
335
+ : Allocator(), m_start(), m_size(), m_capacity()
336
+ {}
337
+
338
+ //Constructor, does not throw
339
+ template<class AllocConvertible>
340
+ explicit vector_alloc_holder(BOOST_FWD_REF(AllocConvertible) a) BOOST_CONTAINER_NOEXCEPT
341
+ : Allocator(boost::forward<AllocConvertible>(a)), m_start(), m_size(), m_capacity()
342
+ {}
343
+
344
+ //Constructor, does not throw
345
+ template<class AllocConvertible>
346
+ explicit vector_alloc_holder(BOOST_FWD_REF(AllocConvertible) a, size_type initial_size)
347
+ : Allocator(boost::forward<AllocConvertible>(a))
348
+ , m_size(initial_size) //Size is initialized here so vector should only call uninitialized_xxx after this
349
+ {
350
+ m_start = this->allocation_command(allocate_new, initial_size, initial_size, m_capacity, m_start).first;
351
+ }
352
+
353
+ //Constructor, does not throw
354
+ explicit vector_alloc_holder(size_type initial_size)
355
+ : Allocator()
356
+ , m_size(initial_size) //Size is initialized here so vector should only call uninitialized_xxx after this
357
+ {
358
+ m_start = this->allocation_command
359
+ (allocate_new, initial_size, initial_size, m_capacity, m_start).first;
360
+ }
361
+
362
+ vector_alloc_holder(BOOST_RV_REF(vector_alloc_holder) holder) BOOST_CONTAINER_NOEXCEPT
363
+ : Allocator(boost::move(static_cast<Allocator&>(holder)))
364
+ , m_start(holder.m_start)
365
+ , m_size(holder.m_size)
366
+ , m_capacity(holder.m_capacity)
367
+ {
368
+ holder.m_start = pointer();
369
+ holder.m_size = holder.m_capacity = 0;
370
+ }
371
+
372
+ void first_allocation(size_type cap)
373
+ {
374
+ m_start = this->allocation_command
375
+ (allocate_new, cap, cap, m_capacity, m_start).first;
376
+ }
377
+
378
+ void first_allocation_same_allocator_type(size_type cap)
379
+ { this->first_allocation(cap); }
380
+
381
+ ~vector_alloc_holder() BOOST_CONTAINER_NOEXCEPT
382
+ {
383
+ if(this->m_capacity){
384
+ this->alloc().deallocate(this->m_start, this->m_capacity);
385
+ }
386
+ }
387
+
388
+ std::pair<pointer, bool>
389
+ allocation_command(allocation_type command,
390
+ size_type limit_size,
391
+ size_type preferred_size,
392
+ size_type &received_size, const pointer &reuse = pointer())
393
+ {
394
+ return allocator_version_traits<Allocator>::allocation_command
395
+ (this->alloc(), command, limit_size, preferred_size, received_size, reuse);
396
+ }
397
+
398
+ size_type next_capacity(size_type additional_objects) const
399
+ {
400
+ std::size_t num_objects = this->m_size + additional_objects;
401
+ std::size_t next_cap = this->m_capacity + this->m_capacity/2;
402
+ return num_objects > next_cap ? num_objects : next_cap;/*
403
+ return get_next_capacity( allocator_traits_type::max_size(this->m_holder.alloc())
404
+ , this->m_capacity, additional_objects);*/
405
+ }
406
+
407
+ pointer m_start;
408
+ size_type m_size;
409
+ size_type m_capacity;
410
+
411
+ void swap(vector_alloc_holder &x) BOOST_CONTAINER_NOEXCEPT
412
+ {
413
+ boost::container::swap_dispatch(this->m_start, x.m_start);
414
+ boost::container::swap_dispatch(this->m_size, x.m_size);
415
+ boost::container::swap_dispatch(this->m_capacity, x.m_capacity);
416
+ }
417
+
418
+ void move_from_empty(vector_alloc_holder &x) BOOST_CONTAINER_NOEXCEPT
419
+ {
420
+ this->m_start = x.m_start;
421
+ this->m_size = x.m_size;
422
+ this->m_capacity = x.m_capacity;
423
+ x.m_start = pointer();
424
+ x.m_size = x.m_capacity = 0;
425
+ }
426
+
427
+ Allocator &alloc() BOOST_CONTAINER_NOEXCEPT
428
+ { return *this; }
429
+
430
+ const Allocator &alloc() const BOOST_CONTAINER_NOEXCEPT
431
+ { return *this; }
432
+
433
+ const pointer &start() const BOOST_CONTAINER_NOEXCEPT { return m_start; }
434
+ const size_type &capacity() const BOOST_CONTAINER_NOEXCEPT { return m_capacity; }
435
+ void start(const pointer &p) BOOST_CONTAINER_NOEXCEPT { m_start = p; }
436
+ void capacity(const size_type &c) BOOST_CONTAINER_NOEXCEPT { m_capacity = c; }
437
+ };
438
+
439
+ //!This struct deallocates and allocated memory
440
+ template <class Allocator>
441
+ struct vector_alloc_holder<Allocator, container_detail::integral_constant<unsigned, 0> >
442
+ : public Allocator
443
+ {
444
+ private:
445
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(vector_alloc_holder)
446
+
447
+ public:
448
+ typedef boost::container::allocator_traits<Allocator> allocator_traits_type;
449
+ typedef typename allocator_traits_type::pointer pointer;
450
+ typedef typename allocator_traits_type::size_type size_type;
451
+ typedef typename allocator_traits_type::value_type value_type;
452
+
453
+ template <class OtherAllocator, class OtherAllocatorVersion>
454
+ friend struct vector_alloc_holder;
455
+
456
+ //Constructor, does not throw
457
+ vector_alloc_holder()
458
+ BOOST_CONTAINER_NOEXCEPT_IF(::boost::has_nothrow_default_constructor<Allocator>::value)
459
+ : Allocator(), m_size()
460
+ {}
461
+
462
+ //Constructor, does not throw
463
+ template<class AllocConvertible>
464
+ explicit vector_alloc_holder(BOOST_FWD_REF(AllocConvertible) a) BOOST_CONTAINER_NOEXCEPT
465
+ : Allocator(boost::forward<AllocConvertible>(a)), m_size()
466
+ {}
467
+
468
+ //Constructor, does not throw
469
+ template<class AllocConvertible>
470
+ explicit vector_alloc_holder(BOOST_FWD_REF(AllocConvertible) a, size_type initial_size)
471
+ : Allocator(boost::forward<AllocConvertible>(a))
472
+ , m_size(initial_size) //Size is initialized here so vector should only call uninitialized_xxx after this
473
+ {
474
+ this->first_allocation(initial_size);
475
+ }
476
+
477
+ //Constructor, does not throw
478
+ explicit vector_alloc_holder(size_type initial_size)
479
+ : Allocator()
480
+ , m_size(initial_size) //Size is initialized here so vector should only call uninitialized_xxx after this
481
+ {
482
+ this->first_allocation(initial_size);
483
+ }
484
+
485
+ vector_alloc_holder(BOOST_RV_REF(vector_alloc_holder) holder)
486
+ : Allocator(boost::move(static_cast<Allocator&>(holder)))
487
+ , m_size(holder.m_size) //Size is initialized here so vector should only call uninitialized_xxx after this
488
+ {
489
+ ::boost::container::uninitialized_move_alloc_n
490
+ (this->alloc(), container_detail::to_raw_pointer(holder.start()), m_size, container_detail::to_raw_pointer(this->start()));
491
+ }
492
+
493
+ template<class OtherAllocator, class OtherAllocatorVersion>
494
+ vector_alloc_holder(BOOST_RV_REF_BEG vector_alloc_holder<OtherAllocator, OtherAllocatorVersion> BOOST_RV_REF_END holder)
495
+ : Allocator()
496
+ , m_size(holder.m_size) //Initialize it to m_size as first_allocation can only succeed or abort
497
+ {
498
+ //Different allocator type so we must check we have enough storage
499
+ const size_type n = holder.m_size;
500
+ this->first_allocation(n);
501
+ ::boost::container::uninitialized_move_alloc_n
502
+ (this->alloc(), container_detail::to_raw_pointer(holder.start()), n, container_detail::to_raw_pointer(this->start()));
503
+ }
504
+
505
+ void first_allocation(size_type cap)
506
+ {
507
+ if(cap > Allocator::internal_capacity){
508
+ throw_bad_alloc();
509
+ }
510
+ }
511
+
512
+ void first_allocation_same_allocator_type(size_type) BOOST_CONTAINER_NOEXCEPT
513
+ {}
514
+
515
+ //Destructor
516
+ ~vector_alloc_holder() BOOST_CONTAINER_NOEXCEPT
517
+ {}
518
+
519
+ void swap(vector_alloc_holder &x)
520
+ {
521
+ this->priv_swap_members_impl(x);
522
+ }
523
+
524
+ template<class OtherAllocator, class OtherAllocatorVersion>
525
+ void swap(vector_alloc_holder<OtherAllocator, OtherAllocatorVersion> &x)
526
+ {
527
+ if(this->m_size > OtherAllocator::internal_capacity || x.m_size > Allocator::internal_capacity){
528
+ throw_bad_alloc();
529
+ }
530
+ this->priv_swap_members_impl(x);
531
+ }
532
+
533
+ void move_from_empty(vector_alloc_holder &)
534
+ { //Containers with version 0 allocators can't be moved without move elements one by one
535
+ throw_bad_alloc();
536
+ }
537
+
538
+ Allocator &alloc() BOOST_CONTAINER_NOEXCEPT
539
+ { return *this; }
540
+
541
+ const Allocator &alloc() const BOOST_CONTAINER_NOEXCEPT
542
+ { return *this; }
543
+
544
+ pointer start() const BOOST_CONTAINER_NOEXCEPT { return Allocator::internal_storage(); }
545
+ size_type capacity() const BOOST_CONTAINER_NOEXCEPT { return Allocator::internal_capacity; }
546
+ size_type m_size;
547
+
548
+ private:
549
+
550
+ template<class OtherAllocator, class OtherAllocatorVersion>
551
+ void priv_swap_members_impl(vector_alloc_holder<OtherAllocator, OtherAllocatorVersion> &x)
552
+ {
553
+ const std::size_t MaxTmpStorage = sizeof(value_type)*Allocator::internal_capacity;
554
+ value_type *const first_this = container_detail::to_raw_pointer(this->start());
555
+ value_type *const first_x = container_detail::to_raw_pointer(x.start());
556
+
557
+ if(this->m_size < x.m_size){
558
+ boost::container::deep_swap_alloc_n<MaxTmpStorage>(this->alloc(), first_this, this->m_size, first_x, x.m_size);
559
+ }
560
+ else{
561
+ boost::container::deep_swap_alloc_n<MaxTmpStorage>(this->alloc(), first_x, x.m_size, first_this, this->m_size);
562
+ }
563
+ boost::container::swap_dispatch(this->m_size, x.m_size);
564
+ }
565
+ };
566
+
567
+ } //namespace container_detail {
568
+ /// @endcond
569
+
570
+ //! \class vector
571
+ //! A vector is a sequence that supports random access to elements, constant
572
+ //! time insertion and removal of elements at the end, and linear time insertion
573
+ //! and removal of elements at the beginning or in the middle. The number of
574
+ //! elements in a vector may vary dynamically; memory management is automatic.
575
+ //! boost::container::vector is similar to std::vector but it's compatible
576
+ //! with shared memory and memory mapped files.
577
+ #ifdef BOOST_CONTAINER_DOXYGEN_INVOKED
578
+ template <class T, class Allocator = std::allocator<T> >
579
+ #else
580
+ template <class T, class Allocator>
581
+ #endif
582
+ class vector
583
+ {
584
+ /// @cond
585
+ typedef container_detail::integral_constant
586
+ <unsigned, boost::container::container_detail::version
587
+ <Allocator>::value > alloc_version;
588
+ boost::container::container_detail::vector_alloc_holder<Allocator, alloc_version> m_holder;
589
+ typedef container_detail::vector_alloc_holder<Allocator> base_t;
590
+ typedef allocator_traits<Allocator> allocator_traits_type;
591
+ template <class U, class UAllocator>
592
+ friend class vector;
593
+ /// @endcond
594
+ public:
595
+ //////////////////////////////////////////////
596
+ //
597
+ // types
598
+ //
599
+ //////////////////////////////////////////////
600
+
601
+ typedef T value_type;
602
+ typedef typename ::boost::container::allocator_traits<Allocator>::pointer pointer;
603
+ typedef typename ::boost::container::allocator_traits<Allocator>::const_pointer const_pointer;
604
+ typedef typename ::boost::container::allocator_traits<Allocator>::reference reference;
605
+ typedef typename ::boost::container::allocator_traits<Allocator>::const_reference const_reference;
606
+ typedef typename ::boost::container::allocator_traits<Allocator>::size_type size_type;
607
+ typedef typename ::boost::container::allocator_traits<Allocator>::difference_type difference_type;
608
+ typedef Allocator allocator_type;
609
+ typedef Allocator stored_allocator_type;
610
+ #if defined BOOST_CONTAINER_VECTOR_ITERATOR_IS_POINTER && !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
611
+ typedef BOOST_CONTAINER_IMPDEF(pointer) iterator;
612
+ typedef BOOST_CONTAINER_IMPDEF(const_pointer) const_iterator;
613
+ #else
614
+ typedef BOOST_CONTAINER_IMPDEF(container_detail::vector_iterator<pointer>) iterator;
615
+ typedef BOOST_CONTAINER_IMPDEF(container_detail::vector_const_iterator<pointer>) const_iterator;
616
+ #endif
617
+ typedef BOOST_CONTAINER_IMPDEF(std::reverse_iterator<iterator>) reverse_iterator;
618
+ typedef BOOST_CONTAINER_IMPDEF(std::reverse_iterator<const_iterator>) const_reverse_iterator;
619
+
620
+ /// @cond
621
+ private:
622
+ BOOST_COPYABLE_AND_MOVABLE(vector)
623
+ typedef container_detail::vector_value_traits<value_type, Allocator> value_traits;
624
+
625
+ typedef container_detail::integral_constant<unsigned, 0> allocator_v0;
626
+ typedef container_detail::integral_constant<unsigned, 1> allocator_v1;
627
+ typedef container_detail::integral_constant<unsigned, 2> allocator_v2;
628
+
629
+ typedef constant_iterator<T, difference_type> cvalue_iterator;
630
+ /// @endcond
631
+
632
+ public:
633
+ //////////////////////////////////////////////
634
+ //
635
+ // construct/copy/destroy
636
+ //
637
+ //////////////////////////////////////////////
638
+
639
+ //! <b>Effects</b>: Constructs a vector taking the allocator as parameter.
640
+ //!
641
+ //! <b>Throws</b>: If allocator_type's default constructor throws.
642
+ //!
643
+ //! <b>Complexity</b>: Constant.
644
+ vector()
645
+ BOOST_CONTAINER_NOEXCEPT_IF(::boost::has_nothrow_default_constructor<Allocator>::value)
646
+ : m_holder()
647
+ {}
648
+
649
+ //! <b>Effects</b>: Constructs a vector taking the allocator as parameter.
650
+ //!
651
+ //! <b>Throws</b>: Nothing
652
+ //!
653
+ //! <b>Complexity</b>: Constant.
654
+ explicit vector(const Allocator& a) BOOST_CONTAINER_NOEXCEPT
655
+ : m_holder(a)
656
+ {}
657
+
658
+ //! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
659
+ //! and inserts n default contructed values.
660
+ //!
661
+ //! <b>Throws</b>: If allocator_type's default constructor or allocation
662
+ //! throws or T's default constructor throws.
663
+ //!
664
+ //! <b>Complexity</b>: Linear to n.
665
+ explicit vector(size_type n)
666
+ : m_holder(n)
667
+ {
668
+ boost::container::uninitialized_default_alloc_n(this->m_holder.alloc(), n, container_detail::to_raw_pointer(this->m_holder.start()));
669
+ }
670
+
671
+ //! <b>Effects</b>: Constructs a vector
672
+ //! and inserts n copies of value.
673
+ //!
674
+ //! <b>Throws</b>: If allocator_type's default constructor or allocation
675
+ //! throws or T's copy constructor throws.
676
+ //!
677
+ //! <b>Complexity</b>: Linear to n.
678
+ vector(size_type n, const T& value)
679
+ : m_holder(n)
680
+ {
681
+ boost::container::uninitialized_fill_alloc_n
682
+ (this->m_holder.alloc(), value, n, container_detail::to_raw_pointer(this->m_holder.start()));
683
+ }
684
+
685
+ //! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
686
+ //! and inserts n copies of value.
687
+ //!
688
+ //! <b>Throws</b>: If allocation
689
+ //! throws or T's copy constructor throws.
690
+ //!
691
+ //! <b>Complexity</b>: Linear to n.
692
+ vector(size_type n, const T& value, const allocator_type& a)
693
+ : m_holder(a, n)
694
+ {
695
+ boost::container::uninitialized_fill_alloc_n
696
+ (this->m_holder.alloc(), value, n, container_detail::to_raw_pointer(this->m_holder.start()));
697
+ }
698
+
699
+ //! <b>Effects</b>: Constructs a vector
700
+ //! and inserts a copy of the range [first, last) in the vector.
701
+ //!
702
+ //! <b>Throws</b>: If allocator_type's default constructor or allocation
703
+ //! throws or T's constructor taking an dereferenced InIt throws.
704
+ //!
705
+ //! <b>Complexity</b>: Linear to the range [first, last).
706
+ template <class InIt>
707
+ vector(InIt first, InIt last)
708
+ : m_holder()
709
+ { this->insert(this->cend(), first, last); }
710
+
711
+ //! <b>Effects</b>: Constructs a vector that will use a copy of allocator a
712
+ //! and inserts a copy of the range [first, last) in the vector.
713
+ //!
714
+ //! <b>Throws</b>: If allocator_type's default constructor or allocation
715
+ //! throws or T's constructor taking an dereferenced InIt throws.
716
+ //!
717
+ //! <b>Complexity</b>: Linear to the range [first, last).
718
+ template <class InIt>
719
+ vector(InIt first, InIt last, const allocator_type& a)
720
+ : m_holder(a)
721
+ { this->insert(this->cend(), first, last); }
722
+
723
+ //! <b>Effects</b>: Copy constructs a vector.
724
+ //!
725
+ //! <b>Postcondition</b>: x == *this.
726
+ //!
727
+ //! <b>Throws</b>: If allocator_type's default constructor or allocation
728
+ //! throws or T's copy constructor throws.
729
+ //!
730
+ //! <b>Complexity</b>: Linear to the elements x contains.
731
+ vector(const vector &x)
732
+ : m_holder(allocator_traits_type::select_on_container_copy_construction(x.m_holder.alloc()), x.size())
733
+ {
734
+ ::boost::container::uninitialized_copy_alloc_n
735
+ ( this->m_holder.alloc(), container_detail::to_raw_pointer(x.m_holder.start())
736
+ , x.size(), container_detail::to_raw_pointer(this->m_holder.start()));
737
+ }
738
+
739
+ //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
740
+ //!
741
+ //! <b>Throws</b>: Nothing
742
+ //!
743
+ //! <b>Complexity</b>: Constant.
744
+ vector(BOOST_RV_REF(vector) mx) BOOST_CONTAINER_NOEXCEPT
745
+ : m_holder(boost::move(mx.m_holder))
746
+ {}
747
+
748
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
749
+
750
+ //! <b>Effects</b>: Move constructor. Moves mx's resources to *this.
751
+ //!
752
+ //! <b>Throws</b>: If T's move constructor or allocation throws
753
+ //!
754
+ //! <b>Complexity</b>: Linear.
755
+ //!
756
+ //! <b>Note</b>: Non-standard extension
757
+ template<class OtherAllocator>
758
+ vector(BOOST_RV_REF_BEG vector<T, OtherAllocator> BOOST_RV_REF_END mx)
759
+ : m_holder(boost::move(mx.m_holder))
760
+ {}
761
+
762
+ #endif //!defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
763
+
764
+ //! <b>Effects</b>: Copy constructs a vector using the specified allocator.
765
+ //!
766
+ //! <b>Postcondition</b>: x == *this.
767
+ //!
768
+ //! <b>Throws</b>: If allocation
769
+ //! throws or T's copy constructor throws.
770
+ //!
771
+ //! <b>Complexity</b>: Linear to the elements x contains.
772
+ vector(const vector &x, const allocator_type &a)
773
+ : m_holder(a, x.size())
774
+ {
775
+ ::boost::container::uninitialized_copy_alloc_n_source
776
+ ( this->m_holder.alloc(), container_detail::to_raw_pointer(x.m_holder.start())
777
+ , x.size(), container_detail::to_raw_pointer(this->m_holder.start()));
778
+ }
779
+
780
+ //! <b>Effects</b>: Move constructor using the specified allocator.
781
+ //! Moves mx's resources to *this if a == allocator_type().
782
+ //! Otherwise copies values from x to *this.
783
+ //!
784
+ //! <b>Throws</b>: If allocation or T's copy constructor throws.
785
+ //!
786
+ //! <b>Complexity</b>: Constant if a == mx.get_allocator(), linear otherwise.
787
+ vector(BOOST_RV_REF(vector) mx, const allocator_type &a)
788
+ : m_holder(a)
789
+ {
790
+ if(mx.m_holder.alloc() == a){
791
+ this->m_holder.move_from_empty(mx.m_holder);
792
+ }
793
+ else{
794
+ const size_type n = mx.size();
795
+ this->m_holder.first_allocation_same_allocator_type(n);
796
+ ::boost::container::uninitialized_move_alloc_n_source
797
+ ( this->m_holder.alloc(), container_detail::to_raw_pointer(mx.m_holder.start())
798
+ , n, container_detail::to_raw_pointer(this->m_holder.start()));
799
+ this->m_holder.m_size = n;
800
+ }
801
+ }
802
+
803
+ //! <b>Effects</b>: Destroys the vector. All stored values are destroyed
804
+ //! and used memory is deallocated.
805
+ //!
806
+ //! <b>Throws</b>: Nothing.
807
+ //!
808
+ //! <b>Complexity</b>: Linear to the number of elements.
809
+ ~vector() BOOST_CONTAINER_NOEXCEPT
810
+ {
811
+ boost::container::destroy_alloc_n
812
+ (this->get_stored_allocator(), container_detail::to_raw_pointer(this->m_holder.start()), this->m_holder.m_size);
813
+ //vector_alloc_holder deallocates the data
814
+ }
815
+
816
+ //! <b>Effects</b>: Makes *this contain the same elements as x.
817
+ //!
818
+ //! <b>Postcondition</b>: this->size() == x.size(). *this contains a copy
819
+ //! of each of x's elements.
820
+ //!
821
+ //! <b>Throws</b>: If memory allocation throws or T's copy/move constructor/assignment throws.
822
+ //!
823
+ //! <b>Complexity</b>: Linear to the number of elements in x.
824
+ vector& operator=(BOOST_COPY_ASSIGN_REF(vector) x)
825
+ {
826
+ if (&x != this){
827
+ this->priv_copy_assign(boost::move(x), alloc_version());
828
+ }
829
+ return *this;
830
+ }
831
+
832
+ //! <b>Effects</b>: Move assignment. All mx's values are transferred to *this.
833
+ //!
834
+ //! <b>Postcondition</b>: x.empty(). *this contains a the elements x had
835
+ //! before the function.
836
+ //!
837
+ //! <b>Throws</b>: Nothing
838
+ //!
839
+ //! <b>Complexity</b>: Linear.
840
+ vector& operator=(BOOST_RV_REF(vector) x)
841
+ //iG BOOST_CONTAINER_NOEXCEPT_IF(!allocator_type::propagate_on_container_move_assignment::value || is_nothrow_move_assignable<allocator_type>::value);)
842
+ BOOST_CONTAINER_NOEXCEPT
843
+ {
844
+ this->priv_move_assign(boost::move(x), alloc_version());
845
+ return *this;
846
+ }
847
+
848
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
849
+
850
+ //! <b>Effects</b>: Move assignment. All mx's values are transferred to *this.
851
+ //!
852
+ //! <b>Postcondition</b>: x.empty(). *this contains a the elements x had
853
+ //! before the function.
854
+ //!
855
+ //! <b>Throws</b>: If move constructor/assignment of T throws or allocation throws
856
+ //!
857
+ //! <b>Complexity</b>: Linear.
858
+ template<class OtherAllocator, class OtherAllocatorVersion>
859
+ vector& operator=(BOOST_RV_REF_BEG vector<OtherAllocator, OtherAllocatorVersion> BOOST_RV_REF_END x)
860
+ {
861
+ this->priv_move_assign(boost::move(x), alloc_version());
862
+ return *this;
863
+ }
864
+
865
+ #endif
866
+
867
+ //! <b>Effects</b>: Assigns the the range [first, last) to *this.
868
+ //!
869
+ //! <b>Throws</b>: If memory allocation throws or T's copy/move constructor/assignment or
870
+ //! T's constructor/assignment from dereferencing InpIt throws.
871
+ //!
872
+ //! <b>Complexity</b>: Linear to n.
873
+ template <class InIt>
874
+ void assign(InIt first, InIt last
875
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
876
+ , typename container_detail::enable_if_c
877
+ < !container_detail::is_convertible<InIt, size_type>::value
878
+ //&& container_detail::is_input_iterator<InIt>::value
879
+ >::type * = 0
880
+ #endif
881
+ )
882
+ {
883
+ //Overwrite all elements we can from [first, last)
884
+ iterator cur = this->begin();
885
+ const iterator end_it = this->end();
886
+ for ( ; first != last && cur != end_it; ++cur, ++first){
887
+ *cur = *first;
888
+ }
889
+
890
+ if (first == last){
891
+ //There are no more elements in the sequence, erase remaining
892
+ T* const end_pos = container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size;
893
+ size_type n = static_cast<size_type>(end_pos - container_detail::to_raw_pointer(vector_iterator_get_ptr(cur)));
894
+ this->priv_destroy_last_n(n);
895
+ }
896
+ else{
897
+ //There are more elements in the range, insert the remaining ones
898
+ this->insert(this->cend(), first, last);
899
+ }
900
+ }
901
+
902
+ //! <b>Effects</b>: Assigns the n copies of val to *this.
903
+ //!
904
+ //! <b>Throws</b>: If memory allocation throws or
905
+ //! T's copy/move constructor/assignment throws.
906
+ //!
907
+ //! <b>Complexity</b>: Linear to n.
908
+ void assign(size_type n, const value_type& val)
909
+ { this->assign(cvalue_iterator(val, n), cvalue_iterator()); }
910
+
911
+ //! <b>Effects</b>: Returns a copy of the internal allocator.
912
+ //!
913
+ //! <b>Throws</b>: If allocator's copy constructor throws.
914
+ //!
915
+ //! <b>Complexity</b>: Constant.
916
+ allocator_type get_allocator() const BOOST_CONTAINER_NOEXCEPT
917
+ { return this->m_holder.alloc(); }
918
+
919
+ //! <b>Effects</b>: Returns a reference to the internal allocator.
920
+ //!
921
+ //! <b>Throws</b>: Nothing
922
+ //!
923
+ //! <b>Complexity</b>: Constant.
924
+ //!
925
+ //! <b>Note</b>: Non-standard extension.
926
+ stored_allocator_type &get_stored_allocator() BOOST_CONTAINER_NOEXCEPT
927
+ { return this->m_holder.alloc(); }
928
+
929
+ //! <b>Effects</b>: Returns a reference to the internal allocator.
930
+ //!
931
+ //! <b>Throws</b>: Nothing
932
+ //!
933
+ //! <b>Complexity</b>: Constant.
934
+ //!
935
+ //! <b>Note</b>: Non-standard extension.
936
+ const stored_allocator_type &get_stored_allocator() const BOOST_CONTAINER_NOEXCEPT
937
+ { return this->m_holder.alloc(); }
938
+
939
+ //////////////////////////////////////////////
940
+ //
941
+ // iterators
942
+ //
943
+ //////////////////////////////////////////////
944
+
945
+ //! <b>Effects</b>: Returns an iterator to the first element contained in the vector.
946
+ //!
947
+ //! <b>Throws</b>: Nothing.
948
+ //!
949
+ //! <b>Complexity</b>: Constant.
950
+ iterator begin() BOOST_CONTAINER_NOEXCEPT
951
+ { return iterator(this->m_holder.start()); }
952
+
953
+ //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
954
+ //!
955
+ //! <b>Throws</b>: Nothing.
956
+ //!
957
+ //! <b>Complexity</b>: Constant.
958
+ const_iterator begin() const BOOST_CONTAINER_NOEXCEPT
959
+ { return const_iterator(this->m_holder.start()); }
960
+
961
+ //! <b>Effects</b>: Returns an iterator to the end of the vector.
962
+ //!
963
+ //! <b>Throws</b>: Nothing.
964
+ //!
965
+ //! <b>Complexity</b>: Constant.
966
+ iterator end() BOOST_CONTAINER_NOEXCEPT
967
+ { return iterator(this->m_holder.start() + this->m_holder.m_size); }
968
+
969
+ //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
970
+ //!
971
+ //! <b>Throws</b>: Nothing.
972
+ //!
973
+ //! <b>Complexity</b>: Constant.
974
+ const_iterator end() const BOOST_CONTAINER_NOEXCEPT
975
+ { return this->cend(); }
976
+
977
+ //! <b>Effects</b>: Returns a reverse_iterator pointing to the beginning
978
+ //! of the reversed vector.
979
+ //!
980
+ //! <b>Throws</b>: Nothing.
981
+ //!
982
+ //! <b>Complexity</b>: Constant.
983
+ reverse_iterator rbegin() BOOST_CONTAINER_NOEXCEPT
984
+ { return reverse_iterator(this->end()); }
985
+
986
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
987
+ //! of the reversed vector.
988
+ //!
989
+ //! <b>Throws</b>: Nothing.
990
+ //!
991
+ //! <b>Complexity</b>: Constant.
992
+ const_reverse_iterator rbegin() const BOOST_CONTAINER_NOEXCEPT
993
+ { return this->crbegin(); }
994
+
995
+ //! <b>Effects</b>: Returns a reverse_iterator pointing to the end
996
+ //! of the reversed vector.
997
+ //!
998
+ //! <b>Throws</b>: Nothing.
999
+ //!
1000
+ //! <b>Complexity</b>: Constant.
1001
+ reverse_iterator rend() BOOST_CONTAINER_NOEXCEPT
1002
+ { return reverse_iterator(this->begin()); }
1003
+
1004
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
1005
+ //! of the reversed vector.
1006
+ //!
1007
+ //! <b>Throws</b>: Nothing.
1008
+ //!
1009
+ //! <b>Complexity</b>: Constant.
1010
+ const_reverse_iterator rend() const BOOST_CONTAINER_NOEXCEPT
1011
+ { return this->crend(); }
1012
+
1013
+ //! <b>Effects</b>: Returns a const_iterator to the first element contained in the vector.
1014
+ //!
1015
+ //! <b>Throws</b>: Nothing.
1016
+ //!
1017
+ //! <b>Complexity</b>: Constant.
1018
+ const_iterator cbegin() const BOOST_CONTAINER_NOEXCEPT
1019
+ { return const_iterator(this->m_holder.start()); }
1020
+
1021
+ //! <b>Effects</b>: Returns a const_iterator to the end of the vector.
1022
+ //!
1023
+ //! <b>Throws</b>: Nothing.
1024
+ //!
1025
+ //! <b>Complexity</b>: Constant.
1026
+ const_iterator cend() const BOOST_CONTAINER_NOEXCEPT
1027
+ { return const_iterator(this->m_holder.start() + this->m_holder.m_size); }
1028
+
1029
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
1030
+ //! of the reversed vector.
1031
+ //!
1032
+ //! <b>Throws</b>: Nothing.
1033
+ //!
1034
+ //! <b>Complexity</b>: Constant.
1035
+ const_reverse_iterator crbegin() const BOOST_CONTAINER_NOEXCEPT
1036
+ { return const_reverse_iterator(this->end());}
1037
+
1038
+ //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
1039
+ //! of the reversed vector.
1040
+ //!
1041
+ //! <b>Throws</b>: Nothing.
1042
+ //!
1043
+ //! <b>Complexity</b>: Constant.
1044
+ const_reverse_iterator crend() const BOOST_CONTAINER_NOEXCEPT
1045
+ { return const_reverse_iterator(this->begin()); }
1046
+
1047
+ //////////////////////////////////////////////
1048
+ //
1049
+ // capacity
1050
+ //
1051
+ //////////////////////////////////////////////
1052
+
1053
+ //! <b>Effects</b>: Returns true if the vector contains no elements.
1054
+ //!
1055
+ //! <b>Throws</b>: Nothing.
1056
+ //!
1057
+ //! <b>Complexity</b>: Constant.
1058
+ bool empty() const BOOST_CONTAINER_NOEXCEPT
1059
+ { return !this->m_holder.m_size; }
1060
+
1061
+ //! <b>Effects</b>: Returns the number of the elements contained in the vector.
1062
+ //!
1063
+ //! <b>Throws</b>: Nothing.
1064
+ //!
1065
+ //! <b>Complexity</b>: Constant.
1066
+ size_type size() const BOOST_CONTAINER_NOEXCEPT
1067
+ { return this->m_holder.m_size; }
1068
+
1069
+ //! <b>Effects</b>: Returns the largest possible size of the vector.
1070
+ //!
1071
+ //! <b>Throws</b>: Nothing.
1072
+ //!
1073
+ //! <b>Complexity</b>: Constant.
1074
+ size_type max_size() const BOOST_CONTAINER_NOEXCEPT
1075
+ { return allocator_traits_type::max_size(this->m_holder.alloc()); }
1076
+
1077
+ //! <b>Effects</b>: Inserts or erases elements at the end such that
1078
+ //! the size becomes n. New elements are default constructed.
1079
+ //!
1080
+ //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
1081
+ //!
1082
+ //! <b>Complexity</b>: Linear to the difference between size() and new_size.
1083
+ void resize(size_type new_size)
1084
+ {
1085
+ const size_type sz = this->size();
1086
+ if (new_size < sz){
1087
+ //Destroy last elements
1088
+ this->priv_destroy_last_n(sz - new_size);
1089
+ }
1090
+ else{
1091
+ const size_type n = new_size - this->size();
1092
+ container_detail::insert_default_constructed_n_proxy<Allocator, T*> proxy(this->m_holder.alloc());
1093
+ this->priv_forward_range_insert_at_end(n, proxy, alloc_version());
1094
+ }
1095
+ }
1096
+
1097
+ //! <b>Effects</b>: Inserts or erases elements at the end such that
1098
+ //! the size becomes n. New elements are copy constructed from x.
1099
+ //!
1100
+ //! <b>Throws</b>: If memory allocation throws, or T's copy constructor throws.
1101
+ //!
1102
+ //! <b>Complexity</b>: Linear to the difference between size() and new_size.
1103
+ void resize(size_type new_size, const T& x)
1104
+ {
1105
+ const size_type sz = this->size();
1106
+ if (new_size < sz){
1107
+ //Destroy last elements
1108
+ this->priv_destroy_last_n(sz - new_size);
1109
+ }
1110
+ else{
1111
+ const size_type n = new_size - this->size();
1112
+ container_detail::insert_n_copies_proxy<Allocator, T*> proxy(this->m_holder.alloc(), x);
1113
+ this->priv_forward_range_insert_at_end(n, proxy, alloc_version());
1114
+ }
1115
+ }
1116
+
1117
+ //! <b>Effects</b>: Number of elements for which memory has been allocated.
1118
+ //! capacity() is always greater than or equal to size().
1119
+ //!
1120
+ //! <b>Throws</b>: Nothing.
1121
+ //!
1122
+ //! <b>Complexity</b>: Constant.
1123
+ size_type capacity() const BOOST_CONTAINER_NOEXCEPT
1124
+ { return this->m_holder.capacity(); }
1125
+
1126
+ //! <b>Effects</b>: If n is less than or equal to capacity(), this call has no
1127
+ //! effect. Otherwise, it is a request for allocation of additional memory.
1128
+ //! If the request is successful, then capacity() is greater than or equal to
1129
+ //! n; otherwise, capacity() is unchanged. In either case, size() is unchanged.
1130
+ //!
1131
+ //! <b>Throws</b>: If memory allocation allocation throws or T's copy/move constructor throws.
1132
+ void reserve(size_type new_cap)
1133
+ {
1134
+ if (this->capacity() < new_cap){
1135
+ this->priv_reserve(new_cap, alloc_version());
1136
+ }
1137
+ }
1138
+
1139
+ //! <b>Effects</b>: Tries to deallocate the excess of memory created
1140
+ //! with previous allocations. The size of the vector is unchanged
1141
+ //!
1142
+ //! <b>Throws</b>: If memory allocation throws, or T's copy/move constructor throws.
1143
+ //!
1144
+ //! <b>Complexity</b>: Linear to size().
1145
+ void shrink_to_fit()
1146
+ { this->priv_shrink_to_fit(alloc_version()); }
1147
+
1148
+ //////////////////////////////////////////////
1149
+ //
1150
+ // element access
1151
+ //
1152
+ //////////////////////////////////////////////
1153
+
1154
+ //! <b>Requires</b>: !empty()
1155
+ //!
1156
+ //! <b>Effects</b>: Returns a reference to the first
1157
+ //! element of the container.
1158
+ //!
1159
+ //! <b>Throws</b>: Nothing.
1160
+ //!
1161
+ //! <b>Complexity</b>: Constant.
1162
+ reference front() BOOST_CONTAINER_NOEXCEPT
1163
+ { return *this->m_holder.start(); }
1164
+
1165
+ //! <b>Requires</b>: !empty()
1166
+ //!
1167
+ //! <b>Effects</b>: Returns a const reference to the first
1168
+ //! element of the container.
1169
+ //!
1170
+ //! <b>Throws</b>: Nothing.
1171
+ //!
1172
+ //! <b>Complexity</b>: Constant.
1173
+ const_reference front() const BOOST_CONTAINER_NOEXCEPT
1174
+ { return *this->m_holder.start(); }
1175
+
1176
+ //! <b>Requires</b>: !empty()
1177
+ //!
1178
+ //! <b>Effects</b>: Returns a reference to the last
1179
+ //! element of the container.
1180
+ //!
1181
+ //! <b>Throws</b>: Nothing.
1182
+ //!
1183
+ //! <b>Complexity</b>: Constant.
1184
+ reference back() BOOST_CONTAINER_NOEXCEPT
1185
+ { return this->m_holder.start()[this->m_holder.m_size - 1]; }
1186
+
1187
+ //! <b>Requires</b>: !empty()
1188
+ //!
1189
+ //! <b>Effects</b>: Returns a const reference to the last
1190
+ //! element of the container.
1191
+ //!
1192
+ //! <b>Throws</b>: Nothing.
1193
+ //!
1194
+ //! <b>Complexity</b>: Constant.
1195
+ const_reference back() const BOOST_CONTAINER_NOEXCEPT
1196
+ { return this->m_holder.start()[this->m_holder.m_size - 1]; }
1197
+
1198
+ //! <b>Requires</b>: size() > n.
1199
+ //!
1200
+ //! <b>Effects</b>: Returns a reference to the nth element
1201
+ //! from the beginning of the container.
1202
+ //!
1203
+ //! <b>Throws</b>: Nothing.
1204
+ //!
1205
+ //! <b>Complexity</b>: Constant.
1206
+ reference operator[](size_type n) BOOST_CONTAINER_NOEXCEPT
1207
+ { return this->m_holder.start()[n]; }
1208
+
1209
+ //! <b>Requires</b>: size() > n.
1210
+ //!
1211
+ //! <b>Effects</b>: Returns a const reference to the nth element
1212
+ //! from the beginning of the container.
1213
+ //!
1214
+ //! <b>Throws</b>: Nothing.
1215
+ //!
1216
+ //! <b>Complexity</b>: Constant.
1217
+ const_reference operator[](size_type n) const BOOST_CONTAINER_NOEXCEPT
1218
+ { return this->m_holder.start()[n]; }
1219
+
1220
+ //! <b>Requires</b>: size() > n.
1221
+ //!
1222
+ //! <b>Effects</b>: Returns a reference to the nth element
1223
+ //! from the beginning of the container.
1224
+ //!
1225
+ //! <b>Throws</b>: std::range_error if n >= size()
1226
+ //!
1227
+ //! <b>Complexity</b>: Constant.
1228
+ reference at(size_type n)
1229
+ { this->priv_check_range(n); return this->m_holder.start()[n]; }
1230
+
1231
+ //! <b>Requires</b>: size() > n.
1232
+ //!
1233
+ //! <b>Effects</b>: Returns a const reference to the nth element
1234
+ //! from the beginning of the container.
1235
+ //!
1236
+ //! <b>Throws</b>: std::range_error if n >= size()
1237
+ //!
1238
+ //! <b>Complexity</b>: Constant.
1239
+ const_reference at(size_type n) const
1240
+ { this->priv_check_range(n); return this->m_holder.start()[n]; }
1241
+
1242
+ //////////////////////////////////////////////
1243
+ //
1244
+ // data access
1245
+ //
1246
+ //////////////////////////////////////////////
1247
+
1248
+ //! <b>Returns</b>: Allocator pointer such that [data(),data() + size()) is a valid range.
1249
+ //! For a non-empty vector, data() == &front().
1250
+ //!
1251
+ //! <b>Throws</b>: Nothing.
1252
+ //!
1253
+ //! <b>Complexity</b>: Constant.
1254
+ T* data() BOOST_CONTAINER_NOEXCEPT
1255
+ { return container_detail::to_raw_pointer(this->m_holder.start()); }
1256
+
1257
+ //! <b>Returns</b>: Allocator pointer such that [data(),data() + size()) is a valid range.
1258
+ //! For a non-empty vector, data() == &front().
1259
+ //!
1260
+ //! <b>Throws</b>: Nothing.
1261
+ //!
1262
+ //! <b>Complexity</b>: Constant.
1263
+ const T * data() const BOOST_CONTAINER_NOEXCEPT
1264
+ { return container_detail::to_raw_pointer(this->m_holder.start()); }
1265
+
1266
+ //////////////////////////////////////////////
1267
+ //
1268
+ // modifiers
1269
+ //
1270
+ //////////////////////////////////////////////
1271
+
1272
+ #if defined(BOOST_CONTAINER_PERFECT_FORWARDING) || defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1273
+ //! <b>Effects</b>: Inserts an object of type T constructed with
1274
+ //! std::forward<Args>(args)... in the end of the vector.
1275
+ //!
1276
+ //! <b>Throws</b>: If memory allocation throws or the in-place constructor throws or
1277
+ //! T's move constructor throws.
1278
+ //!
1279
+ //! <b>Complexity</b>: Amortized constant time.
1280
+ template<class ...Args>
1281
+ void emplace_back(Args &&...args)
1282
+ {
1283
+ T* back_pos = container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size;
1284
+ if (this->m_holder.m_size < this->m_holder.capacity()){
1285
+ //There is more memory, just construct a new object at the end
1286
+ allocator_traits_type::construct(this->m_holder.alloc(), back_pos, ::boost::forward<Args>(args)...);
1287
+ ++this->m_holder.m_size;
1288
+ }
1289
+ else{
1290
+ typedef container_detail::insert_emplace_proxy<Allocator, T*, Args...> type;
1291
+ this->priv_forward_range_insert_no_capacity
1292
+ (vector_iterator_get_ptr(this->cend()), 1, type(this->m_holder.alloc(), ::boost::forward<Args>(args)...), alloc_version());
1293
+ }
1294
+ }
1295
+
1296
+ //! <b>Requires</b>: position must be a valid iterator of *this.
1297
+ //!
1298
+ //! <b>Effects</b>: Inserts an object of type T constructed with
1299
+ //! std::forward<Args>(args)... before position
1300
+ //!
1301
+ //! <b>Throws</b>: If memory allocation throws or the in-place constructor throws or
1302
+ //! T's move constructor/assignment throws.
1303
+ //!
1304
+ //! <b>Complexity</b>: If position is end(), amortized constant time
1305
+ //! Linear time otherwise.
1306
+ template<class ...Args>
1307
+ iterator emplace(const_iterator position, Args && ...args)
1308
+ {
1309
+ //Just call more general insert(pos, size, value) and return iterator
1310
+ typedef container_detail::insert_emplace_proxy<Allocator, T*, Args...> type;
1311
+ return this->priv_forward_range_insert( vector_iterator_get_ptr(position), 1, type(this->m_holder.alloc()
1312
+ , ::boost::forward<Args>(args)...), alloc_version());
1313
+ }
1314
+
1315
+ #else
1316
+
1317
+ #define BOOST_PP_LOCAL_MACRO(n) \
1318
+ BOOST_PP_EXPR_IF(n, template<) BOOST_PP_ENUM_PARAMS(n, class P) BOOST_PP_EXPR_IF(n, >) \
1319
+ void emplace_back(BOOST_PP_ENUM(n, BOOST_CONTAINER_PP_PARAM_LIST, _)) \
1320
+ { \
1321
+ T* back_pos = container_detail::to_raw_pointer \
1322
+ (this->m_holder.start()) + this->m_holder.m_size; \
1323
+ if (this->m_holder.m_size < this->m_holder.capacity()){ \
1324
+ allocator_traits_type::construct (this->m_holder.alloc() \
1325
+ , back_pos BOOST_PP_ENUM_TRAILING(n, BOOST_CONTAINER_PP_PARAM_FORWARD, _) ); \
1326
+ ++this->m_holder.m_size; \
1327
+ } \
1328
+ else{ \
1329
+ container_detail::BOOST_PP_CAT(insert_emplace_proxy_arg, n) \
1330
+ <Allocator, T* BOOST_PP_ENUM_TRAILING_PARAMS(n, P)> proxy \
1331
+ (this->m_holder.alloc() BOOST_PP_ENUM_TRAILING(n, BOOST_CONTAINER_PP_PARAM_FORWARD, _)); \
1332
+ this->priv_forward_range_insert_no_capacity \
1333
+ (vector_iterator_get_ptr(this->cend()), 1, proxy, alloc_version()); \
1334
+ } \
1335
+ } \
1336
+ \
1337
+ BOOST_PP_EXPR_IF(n, template<) BOOST_PP_ENUM_PARAMS(n, class P) BOOST_PP_EXPR_IF(n, >) \
1338
+ iterator emplace(const_iterator pos \
1339
+ BOOST_PP_ENUM_TRAILING(n, BOOST_CONTAINER_PP_PARAM_LIST, _)) \
1340
+ { \
1341
+ container_detail::BOOST_PP_CAT(insert_emplace_proxy_arg, n) \
1342
+ <Allocator, T* BOOST_PP_ENUM_TRAILING_PARAMS(n, P)> proxy \
1343
+ (this->m_holder.alloc() BOOST_PP_ENUM_TRAILING(n, BOOST_CONTAINER_PP_PARAM_FORWARD, _)); \
1344
+ return this->priv_forward_range_insert \
1345
+ (container_detail::to_raw_pointer(vector_iterator_get_ptr(pos)), 1, proxy, alloc_version()); \
1346
+ } \
1347
+ //!
1348
+ #define BOOST_PP_LOCAL_LIMITS (0, BOOST_CONTAINER_MAX_CONSTRUCTOR_PARAMETERS)
1349
+ #include BOOST_PP_LOCAL_ITERATE()
1350
+
1351
+ #endif //#ifdef BOOST_CONTAINER_PERFECT_FORWARDING
1352
+
1353
+ #if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1354
+ //! <b>Effects</b>: Inserts a copy of x at the end of the vector.
1355
+ //!
1356
+ //! <b>Throws</b>: If memory allocation throws or
1357
+ //! T's copy/move constructor throws.
1358
+ //!
1359
+ //! <b>Complexity</b>: Amortized constant time.
1360
+ void push_back(const T &x);
1361
+
1362
+ //! <b>Effects</b>: Constructs a new element in the end of the vector
1363
+ //! and moves the resources of mx to this new element.
1364
+ //!
1365
+ //! <b>Throws</b>: If memory allocation throws or
1366
+ //! T's move constructor throws.
1367
+ //!
1368
+ //! <b>Complexity</b>: Amortized constant time.
1369
+ void push_back(T &&x);
1370
+ #else
1371
+ BOOST_MOVE_CONVERSION_AWARE_CATCH(push_back, T, void, priv_push_back)
1372
+ #endif
1373
+
1374
+ #if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1375
+ //! <b>Requires</b>: position must be a valid iterator of *this.
1376
+ //!
1377
+ //! <b>Effects</b>: Insert a copy of x before position.
1378
+ //!
1379
+ //! <b>Throws</b>: If memory allocation throws or T's copy/move constructor/assignment throws.
1380
+ //!
1381
+ //! <b>Complexity</b>: If position is end(), amortized constant time
1382
+ //! Linear time otherwise.
1383
+ iterator insert(const_iterator position, const T &x);
1384
+
1385
+ //! <b>Requires</b>: position must be a valid iterator of *this.
1386
+ //!
1387
+ //! <b>Effects</b>: Insert a new element before position with mx's resources.
1388
+ //!
1389
+ //! <b>Throws</b>: If memory allocation throws.
1390
+ //!
1391
+ //! <b>Complexity</b>: If position is end(), amortized constant time
1392
+ //! Linear time otherwise.
1393
+ iterator insert(const_iterator position, T &&x);
1394
+ #else
1395
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(insert, T, iterator, priv_insert, const_iterator)
1396
+ #endif
1397
+
1398
+ //! <b>Requires</b>: p must be a valid iterator of *this.
1399
+ //!
1400
+ //! <b>Effects</b>: Insert n copies of x before pos.
1401
+ //!
1402
+ //! <b>Returns</b>: an iterator to the first inserted element or p if n is 0.
1403
+ //!
1404
+ //! <b>Throws</b>: If memory allocation throws or T's copy constructor throws.
1405
+ //!
1406
+ //! <b>Complexity</b>: Linear to n.
1407
+ iterator insert(const_iterator p, size_type n, const T& x)
1408
+ {
1409
+ container_detail::insert_n_copies_proxy<Allocator, T*> proxy(this->m_holder.alloc(), x);
1410
+ return this->priv_forward_range_insert(vector_iterator_get_ptr(p), n, proxy, alloc_version());
1411
+ }
1412
+
1413
+ //! <b>Requires</b>: p must be a valid iterator of *this.
1414
+ //!
1415
+ //! <b>Effects</b>: Insert a copy of the [first, last) range before pos.
1416
+ //!
1417
+ //! <b>Returns</b>: an iterator to the first inserted element or pos if first == last.
1418
+ //!
1419
+ //! <b>Throws</b>: If memory allocation throws, T's constructor from a
1420
+ //! dereferenced InpIt throws or T's copy/move constructor/assignment throws.
1421
+ //!
1422
+ //! <b>Complexity</b>: Linear to std::distance [first, last).
1423
+ template <class InIt>
1424
+ iterator insert(const_iterator pos, InIt first, InIt last
1425
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1426
+ , typename container_detail::enable_if_c
1427
+ < !container_detail::is_convertible<InIt, size_type>::value
1428
+ && container_detail::is_input_iterator<InIt>::value
1429
+ >::type * = 0
1430
+ #endif
1431
+ )
1432
+ {
1433
+ const size_type n_pos = pos - this->cbegin();
1434
+ iterator it(vector_iterator_get_ptr(pos));
1435
+ for(;first != last; ++first){
1436
+ it = this->emplace(it, *first);
1437
+ ++it;
1438
+ }
1439
+ return iterator(this->m_holder.start() + n_pos);
1440
+ }
1441
+
1442
+ #if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
1443
+ template <class FwdIt>
1444
+ iterator insert(const_iterator pos, FwdIt first, FwdIt last
1445
+ , typename container_detail::enable_if_c
1446
+ < !container_detail::is_convertible<FwdIt, size_type>::value
1447
+ && !container_detail::is_input_iterator<FwdIt>::value
1448
+ >::type * = 0
1449
+ )
1450
+ {
1451
+ container_detail::insert_range_proxy<Allocator, FwdIt, T*> proxy(this->m_holder.alloc(), first);
1452
+ return this->priv_forward_range_insert(vector_iterator_get_ptr(pos), std::distance(first, last), proxy, alloc_version());
1453
+ }
1454
+ #endif
1455
+
1456
+ //! <b>Effects</b>: Removes the last element from the vector.
1457
+ //!
1458
+ //! <b>Throws</b>: Nothing.
1459
+ //!
1460
+ //! <b>Complexity</b>: Constant time.
1461
+ void pop_back() BOOST_CONTAINER_NOEXCEPT
1462
+ {
1463
+ //Destroy last element
1464
+ --this->m_holder.m_size;
1465
+ this->priv_destroy(container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size);
1466
+ }
1467
+
1468
+ //! <b>Effects</b>: Erases the element at position pos.
1469
+ //!
1470
+ //! <b>Throws</b>: Nothing.
1471
+ //!
1472
+ //! <b>Complexity</b>: Linear to the elements between pos and the
1473
+ //! last element. Constant if pos is the last element.
1474
+ iterator erase(const_iterator position)
1475
+ {
1476
+ T *const pos = container_detail::to_raw_pointer(vector_iterator_get_ptr(position));
1477
+ T *const beg = container_detail::to_raw_pointer(this->m_holder.start());
1478
+ //Move elements forward and destroy last
1479
+ this->priv_destroy(::boost::move(pos + 1, beg + this->m_holder.m_size, pos));
1480
+ --this->m_holder.m_size;
1481
+ return iterator(vector_iterator_get_ptr(position));
1482
+ }
1483
+
1484
+ //! <b>Effects</b>: Erases the elements pointed by [first, last).
1485
+ //!
1486
+ //! <b>Throws</b>: Nothing.
1487
+ //!
1488
+ //! <b>Complexity</b>: Linear to the distance between first and last
1489
+ //! plus linear to the elements between pos and the last element.
1490
+ iterator erase(const_iterator first, const_iterator last)
1491
+ {
1492
+ if (first != last){
1493
+ T* const end_pos = container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size;
1494
+ T* const ptr = container_detail::to_raw_pointer(boost::move
1495
+ (container_detail::to_raw_pointer(vector_iterator_get_ptr(last))
1496
+ ,end_pos
1497
+ ,container_detail::to_raw_pointer(vector_iterator_get_ptr(first))
1498
+ ));
1499
+ const size_type destroyed = (end_pos - ptr);
1500
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), ptr, destroyed);
1501
+ this->m_holder.m_size -= destroyed;
1502
+ }
1503
+ return iterator(vector_iterator_get_ptr(first));
1504
+ }
1505
+
1506
+ //! <b>Effects</b>: Swaps the contents of *this and x.
1507
+ //!
1508
+ //! <b>Throws</b>: Nothing.
1509
+ //!
1510
+ //! <b>Complexity</b>: Constant.
1511
+ void swap(vector& x) BOOST_CONTAINER_NOEXCEPT_IF((!container_detail::is_same<alloc_version, allocator_v0>::value))
1512
+ {
1513
+ //Just swap internals in case of !allocator_v0. Otherwise, deep swap
1514
+ this->m_holder.swap(x.m_holder);
1515
+ //And now the allocator
1516
+ container_detail::bool_<allocator_traits_type::propagate_on_container_swap::value> flag;
1517
+ container_detail::swap_alloc(this->m_holder.alloc(), x.m_holder.alloc(), flag);
1518
+ }
1519
+
1520
+ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1521
+
1522
+ //! <b>Effects</b>: Swaps the contents of *this and x.
1523
+ //!
1524
+ //! <b>Throws</b>: If T's move constructor throws.
1525
+ //!
1526
+ //! <b>Complexity</b>: Linear
1527
+ //!
1528
+ //! <b>Note</b>: non-standard extension.
1529
+ template<class OtherAllocator>
1530
+ void swap(vector<T, OtherAllocator> & x)
1531
+ {
1532
+ this->m_holder.swap(x.m_holder);
1533
+ }
1534
+
1535
+ #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1536
+
1537
+ //! <b>Effects</b>: Erases all the elements of the vector.
1538
+ //!
1539
+ //! <b>Throws</b>: Nothing.
1540
+ //!
1541
+ //! <b>Complexity</b>: Linear to the number of elements in the vector.
1542
+ void clear() BOOST_CONTAINER_NOEXCEPT
1543
+ { this->priv_destroy_all(); }
1544
+
1545
+ /// @cond
1546
+
1547
+ //Absolutely experimental. This function might change, disappear or simply crash!
1548
+ template<class BiDirPosConstIt, class BiDirValueIt>
1549
+ void insert_ordered_at(size_type element_count, BiDirPosConstIt last_position_it, BiDirValueIt last_value_it)
1550
+ {
1551
+ const size_type *dummy = 0;
1552
+ this->priv_insert_ordered_at(element_count, last_position_it, false, &dummy[0], last_value_it);
1553
+ }
1554
+
1555
+ //Absolutely experimental. This function might change, disappear or simply crash!
1556
+ template<class BiDirPosConstIt, class BiDirSkipConstIt, class BiDirValueIt>
1557
+ void insert_ordered_at(size_type element_count, BiDirPosConstIt last_position_it, BiDirSkipConstIt last_skip_it, BiDirValueIt last_value_it)
1558
+ {
1559
+ this->priv_insert_ordered_at(element_count, last_position_it, true, last_skip_it, last_value_it);
1560
+ }
1561
+
1562
+ private:
1563
+
1564
+ template<class OtherAllocator, class AllocVersion>
1565
+ void priv_move_assign(BOOST_RV_REF_BEG vector<T, OtherAllocator> BOOST_RV_REF_END x
1566
+ , AllocVersion
1567
+ , typename container_detail::enable_if_c
1568
+ < container_detail::is_same<AllocVersion, allocator_v0>::value &&
1569
+ !container_detail::is_same<OtherAllocator, allocator_type>::value
1570
+ >::type * = 0)
1571
+ {
1572
+ if(this->capacity() < x.size()){
1573
+ throw_bad_alloc();
1574
+ }
1575
+ this->priv_move_assign_impl(boost::move(x), AllocVersion());
1576
+ }
1577
+
1578
+ template<class OtherAllocator, class AllocVersion>
1579
+ void priv_move_assign(BOOST_RV_REF_BEG vector<T, OtherAllocator> BOOST_RV_REF_END x
1580
+ , AllocVersion
1581
+ , typename container_detail::enable_if_c
1582
+ < !container_detail::is_same<AllocVersion, allocator_v0>::value ||
1583
+ container_detail::is_same<OtherAllocator, allocator_type>::value
1584
+ >::type * = 0)
1585
+ {
1586
+ this->priv_move_assign_impl(boost::move(x), AllocVersion());
1587
+ }
1588
+
1589
+ template<class OtherAllocator, class AllocVersion>
1590
+ void priv_move_assign_impl(BOOST_RV_REF_BEG vector<T, OtherAllocator> BOOST_RV_REF_END x
1591
+ , AllocVersion
1592
+ , typename container_detail::enable_if_c
1593
+ < container_detail::is_same<AllocVersion, allocator_v0>::value
1594
+ >::type * = 0)
1595
+ {
1596
+ T* const this_start = container_detail::to_raw_pointer(m_holder.start());
1597
+ T* const other_start = container_detail::to_raw_pointer(x.m_holder.start());
1598
+ const size_type this_sz = m_holder.m_size;
1599
+ const size_type other_sz = static_cast<size_type>(x.m_holder.m_size);
1600
+ boost::container::move_assign_range_alloc_n(this->m_holder.alloc(), other_start, other_sz, this_start, this_sz);
1601
+ this->m_holder.m_size = other_sz;
1602
+ }
1603
+
1604
+ template<class OtherAllocator, class AllocVersion>
1605
+ void priv_move_assign_impl(BOOST_RV_REF_BEG vector<T, OtherAllocator> BOOST_RV_REF_END x
1606
+ , AllocVersion
1607
+ , typename container_detail::enable_if_c
1608
+ < !container_detail::is_same<AllocVersion, allocator_v0>::value
1609
+ >::type * = 0)
1610
+ {
1611
+ //for move constructor, no aliasing (&x != this) is assummed.
1612
+ allocator_type &this_alloc = this->m_holder.alloc();
1613
+ allocator_type &x_alloc = x.m_holder.alloc();
1614
+ //If allocators are equal we can just swap pointers
1615
+ if(this_alloc == x_alloc){
1616
+ //Destroy objects but retain memory in case x reuses it in the future
1617
+ this->clear();
1618
+ this->m_holder.swap(x.m_holder);
1619
+ //Move allocator if needed
1620
+ container_detail::bool_<allocator_traits_type::
1621
+ propagate_on_container_move_assignment::value> flag;
1622
+ container_detail::move_alloc(this_alloc, x_alloc, flag);
1623
+ }
1624
+ //If unequal allocators, then do a one by one move
1625
+ else{
1626
+ //TO-DO: optimize this
1627
+ this->assign( boost::make_move_iterator(container_detail::to_raw_pointer(x.m_holder.start()))
1628
+ , boost::make_move_iterator(container_detail::to_raw_pointer(x.m_holder.start() + x.m_holder.m_size)));
1629
+ }
1630
+ }
1631
+
1632
+ template<class AllocVersion>
1633
+ void priv_copy_assign(const vector &x, AllocVersion
1634
+ , typename container_detail::enable_if_c
1635
+ < container_detail::is_same<AllocVersion, allocator_v0>::value
1636
+ >::type * = 0)
1637
+ {
1638
+ T* const this_start = container_detail::to_raw_pointer(m_holder.start());
1639
+ T* const other_start = container_detail::to_raw_pointer(x.m_holder.start());
1640
+ const size_type this_sz = m_holder.m_size;
1641
+ const size_type other_sz = static_cast<size_type>(x.m_holder.m_size);
1642
+ boost::container::copy_assign_range_alloc_n(this->m_holder.alloc(), other_start, other_sz, this_start, this_sz);
1643
+ this->m_holder.m_size = other_sz;
1644
+ }
1645
+
1646
+ template<class AllocVersion>
1647
+ void priv_copy_assign(const vector &x, AllocVersion
1648
+ , typename container_detail::enable_if_c
1649
+ < !container_detail::is_same<AllocVersion, allocator_v0>::value
1650
+ >::type * = 0)
1651
+ {
1652
+ allocator_type &this_alloc = this->m_holder.alloc();
1653
+ const allocator_type &x_alloc = x.m_holder.alloc();
1654
+ container_detail::bool_<allocator_traits_type::
1655
+ propagate_on_container_copy_assignment::value> flag;
1656
+ if(flag && this_alloc != x_alloc){
1657
+ this->clear();
1658
+ this->shrink_to_fit();
1659
+ }
1660
+ container_detail::assign_alloc(this_alloc, x_alloc, flag);
1661
+ this->assign( container_detail::to_raw_pointer(x.m_holder.start())
1662
+ , container_detail::to_raw_pointer(x.m_holder.start() + x.m_holder.m_size));
1663
+ }
1664
+
1665
+ void priv_reserve(size_type, allocator_v0)
1666
+ {
1667
+ throw_bad_alloc();
1668
+ }
1669
+
1670
+ void priv_reserve(size_type new_cap, allocator_v1)
1671
+ {
1672
+ //There is not enough memory, allocate a new buffer
1673
+ pointer p = this->m_holder.allocate(new_cap);
1674
+ //Backwards (and possibly forward) expansion
1675
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1676
+ ++this->num_alloc;
1677
+ #endif
1678
+ T * const raw_beg = container_detail::to_raw_pointer(this->m_holder.start());
1679
+ const size_type sz = m_holder.m_size;
1680
+ ::boost::container::uninitialized_move_alloc_n_source
1681
+ ( this->m_holder.alloc(), raw_beg, sz, container_detail::to_raw_pointer(p) );
1682
+ boost::container::destroy_alloc_n(this->m_holder.alloc(), raw_beg, sz);
1683
+ this->m_holder.start(p);
1684
+ this->m_holder.capacity(new_cap);
1685
+ }
1686
+
1687
+ void priv_reserve(size_type new_cap, allocator_v2)
1688
+ {
1689
+ //There is not enough memory, allocate a new
1690
+ //buffer or expand the old one.
1691
+ bool same_buffer_start;
1692
+ size_type real_cap = 0;
1693
+ std::pair<pointer, bool> ret =
1694
+ this->m_holder.allocation_command
1695
+ (allocate_new | expand_fwd | expand_bwd,
1696
+ new_cap, new_cap, real_cap, this->m_holder.start());
1697
+
1698
+ //Check for forward expansion
1699
+ same_buffer_start = ret.second && this->m_holder.start() == ret.first;
1700
+ if(same_buffer_start){
1701
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1702
+ ++this->num_expand_fwd;
1703
+ #endif
1704
+ this->m_holder.capacity(real_cap);
1705
+ }
1706
+ //If there is no forward expansion, move objects
1707
+ else{
1708
+ //Backwards (and possibly forward) expansion
1709
+ if(ret.second){
1710
+ //We will reuse insert code, so create a dummy input iterator
1711
+ container_detail::insert_range_proxy<Allocator, boost::move_iterator<T*>, T*>
1712
+ proxy(this->m_holder.alloc(), ::boost::make_move_iterator((T *)0));
1713
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1714
+ ++this->num_expand_bwd;
1715
+ #endif
1716
+ this->priv_forward_range_insert_expand_backwards
1717
+ ( container_detail::to_raw_pointer(ret.first)
1718
+ , real_cap
1719
+ , container_detail::to_raw_pointer(this->m_holder.start())
1720
+ , 0
1721
+ , proxy);
1722
+ }
1723
+ //New buffer
1724
+ else{
1725
+ //Backwards (and possibly forward) expansion
1726
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1727
+ ++this->num_alloc;
1728
+ #endif
1729
+ T * const raw_beg = container_detail::to_raw_pointer(this->m_holder.start());
1730
+ const size_type sz = m_holder.m_size;
1731
+ ::boost::container::uninitialized_move_alloc_n_source
1732
+ ( this->m_holder.alloc(), raw_beg, sz, container_detail::to_raw_pointer(ret.first) );
1733
+ boost::container::destroy_alloc_n(this->m_holder.alloc(), raw_beg, sz);
1734
+ this->m_holder.start(ret.first);
1735
+ this->m_holder.capacity(real_cap);
1736
+ }
1737
+ }
1738
+ }
1739
+
1740
+ template<class Proxy>
1741
+ void priv_uninitialized_fill(Proxy proxy, size_type n) const
1742
+ {
1743
+ //Copy first new elements in pos
1744
+ proxy.uninitialized_copy_n_and_update
1745
+ (container_detail::to_raw_pointer(this->m_holder.start()), n);
1746
+ //m_holder.size was already initialized to n in vector_alloc_holder's constructor
1747
+ }
1748
+
1749
+ void priv_destroy(value_type* p) BOOST_CONTAINER_NOEXCEPT
1750
+ {
1751
+ if(!value_traits::trivial_dctr)
1752
+ allocator_traits_type::destroy(this->get_stored_allocator(), p);
1753
+ }
1754
+
1755
+ void priv_destroy_last_n(size_type n) BOOST_CONTAINER_NOEXCEPT
1756
+ {
1757
+ T* const end_pos = container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size;
1758
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), end_pos-n, n);
1759
+ this->m_holder.m_size -= n;
1760
+ }
1761
+
1762
+ void priv_destroy_all() BOOST_CONTAINER_NOEXCEPT
1763
+ {
1764
+ boost::container::destroy_alloc_n
1765
+ (this->get_stored_allocator(), container_detail::to_raw_pointer(this->m_holder.start()), this->m_holder.m_size);
1766
+ this->m_holder.m_size = 0;
1767
+ }
1768
+
1769
+ template<class U>
1770
+ iterator priv_insert(const const_iterator &p, BOOST_FWD_REF(U) x)
1771
+ {
1772
+ return this->priv_forward_range_insert
1773
+ ( vector_iterator_get_ptr(p), 1, container_detail::get_insert_value_proxy<T*>(this->m_holder.alloc()
1774
+ , ::boost::forward<U>(x)), alloc_version());
1775
+ }
1776
+
1777
+ void priv_push_back(const T &x)
1778
+ {
1779
+ if (this->m_holder.m_size < this->m_holder.capacity()){
1780
+ //There is more memory, just construct a new object at the end
1781
+ allocator_traits_type::construct
1782
+ ( this->m_holder.alloc()
1783
+ , container_detail::to_raw_pointer(this->m_holder.start() + this->m_holder.m_size)
1784
+ , x );
1785
+ ++this->m_holder.m_size;
1786
+ }
1787
+ else{
1788
+ container_detail::insert_copy_proxy<Allocator, T*> proxy(this->m_holder.alloc(), x);
1789
+ this->priv_forward_range_insert_no_capacity(vector_iterator_get_ptr(this->cend()), 1, proxy, alloc_version());
1790
+ }
1791
+ }
1792
+
1793
+ void priv_push_back(BOOST_RV_REF(T) x)
1794
+ {
1795
+ if (this->m_holder.m_size < this->m_holder.capacity()){
1796
+ //There is more memory, just construct a new object at the end
1797
+ allocator_traits_type::construct
1798
+ ( this->m_holder.alloc()
1799
+ , container_detail::to_raw_pointer(this->m_holder.start() + this->m_holder.m_size)
1800
+ , ::boost::move(x) );
1801
+ ++this->m_holder.m_size;
1802
+ }
1803
+ else{
1804
+ container_detail::insert_move_proxy<Allocator, T*> proxy(this->m_holder.alloc(), x);
1805
+ this->priv_forward_range_insert_no_capacity(vector_iterator_get_ptr(this->cend()), 1, proxy, alloc_version());
1806
+ }
1807
+ }
1808
+
1809
+ void priv_shrink_to_fit(allocator_v0) BOOST_CONTAINER_NOEXCEPT
1810
+ {}
1811
+
1812
+ void priv_shrink_to_fit(allocator_v1)
1813
+ {
1814
+ const size_type cp = this->m_holder.capacity();
1815
+ if(cp){
1816
+ const size_type sz = this->size();
1817
+ if(!sz){
1818
+ this->m_holder.alloc().deallocate(this->m_holder.m_start, cp);
1819
+ this->m_holder.m_start = pointer();
1820
+ this->m_holder.m_capacity = 0;
1821
+ }
1822
+ else if(sz < cp){
1823
+ //Allocate a new buffer.
1824
+ pointer p = this->m_holder.allocate(sz);
1825
+
1826
+ //We will reuse insert code, so create a dummy input iterator
1827
+ container_detail::insert_range_proxy<Allocator, boost::move_iterator<T*>, T*>
1828
+ proxy(this->m_holder.alloc(), ::boost::make_move_iterator((T *)0));
1829
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1830
+ ++this->num_alloc;
1831
+ #endif
1832
+ this->priv_forward_range_insert_new_allocation
1833
+ ( container_detail::to_raw_pointer(p)
1834
+ , sz
1835
+ , container_detail::to_raw_pointer(this->m_holder.start())
1836
+ , 0
1837
+ , proxy);
1838
+ }
1839
+ }
1840
+ }
1841
+
1842
+ void priv_shrink_to_fit(allocator_v2) BOOST_CONTAINER_NOEXCEPT
1843
+ {
1844
+ const size_type cp = this->m_holder.capacity();
1845
+ if(cp){
1846
+ const size_type sz = this->size();
1847
+ if(!sz){
1848
+ this->m_holder.alloc().deallocate(this->m_holder.m_start, cp);
1849
+ this->m_holder.m_start = pointer();
1850
+ this->m_holder.m_capacity = 0;
1851
+ }
1852
+ else{
1853
+ size_type received_size;
1854
+ if(this->m_holder.allocation_command
1855
+ ( shrink_in_place | nothrow_allocation
1856
+ , cp, sz, received_size, this->m_holder.start()).first){
1857
+ this->m_holder.capacity(received_size);
1858
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1859
+ ++this->num_shrink;
1860
+ #endif
1861
+ }
1862
+ }
1863
+ }
1864
+ }
1865
+
1866
+ template <class InsertionProxy>
1867
+ iterator priv_forward_range_insert_no_capacity
1868
+ (const pointer &pos, const size_type, const InsertionProxy , allocator_v0)
1869
+ {
1870
+ throw_bad_alloc();
1871
+ return iterator(pos);
1872
+ }
1873
+
1874
+ template <class InsertionProxy>
1875
+ iterator priv_forward_range_insert_no_capacity
1876
+ (const pointer &pos, const size_type n, const InsertionProxy insert_range_proxy, allocator_v1)
1877
+ {
1878
+ //Check if we have enough memory or try to expand current memory
1879
+ const size_type n_pos = pos - this->m_holder.start();
1880
+ T *const raw_pos = container_detail::to_raw_pointer(pos);
1881
+
1882
+ const size_type new_cap = this->m_holder.next_capacity(n);
1883
+ T * new_buf = container_detail::to_raw_pointer(this->m_holder.alloc().allocate(new_cap));
1884
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1885
+ ++this->num_alloc;
1886
+ #endif
1887
+ this->priv_forward_range_insert_new_allocation
1888
+ ( new_buf, new_cap, raw_pos, n, insert_range_proxy);
1889
+ return iterator(this->m_holder.start() + n_pos);
1890
+ }
1891
+
1892
+
1893
+ template <class InsertionProxy>
1894
+ iterator priv_forward_range_insert_no_capacity
1895
+ (const pointer &pos, const size_type n, const InsertionProxy insert_range_proxy, allocator_v2)
1896
+ {
1897
+ //Check if we have enough memory or try to expand current memory
1898
+ T *const raw_pos = container_detail::to_raw_pointer(pos);
1899
+ const size_type n_pos = raw_pos - container_detail::to_raw_pointer(this->m_holder.start());
1900
+
1901
+ size_type real_cap = 0;
1902
+ //There is not enough memory, allocate a new
1903
+ //buffer or expand the old one.
1904
+ std::pair<pointer, bool> ret = (this->m_holder.allocation_command
1905
+ (allocate_new | expand_fwd | expand_bwd,
1906
+ this->m_holder.m_size + n, this->m_holder.next_capacity(n), real_cap, this->m_holder.start()));
1907
+
1908
+ //Buffer reallocated
1909
+ if(ret.second){
1910
+ //Forward expansion, delay insertion
1911
+ if(this->m_holder.start() == ret.first){
1912
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1913
+ ++this->num_expand_fwd;
1914
+ #endif
1915
+ this->m_holder.capacity(real_cap);
1916
+ //Expand forward
1917
+ this->priv_forward_range_insert_expand_forward(raw_pos, n, insert_range_proxy);
1918
+ }
1919
+ //Backwards (and possibly forward) expansion
1920
+ else{
1921
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1922
+ ++this->num_expand_bwd;
1923
+ #endif
1924
+ this->priv_forward_range_insert_expand_backwards
1925
+ ( container_detail::to_raw_pointer(ret.first)
1926
+ , real_cap, raw_pos, n, insert_range_proxy);
1927
+ }
1928
+ }
1929
+ //New buffer
1930
+ else{
1931
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
1932
+ ++this->num_alloc;
1933
+ #endif
1934
+ this->priv_forward_range_insert_new_allocation
1935
+ ( container_detail::to_raw_pointer(ret.first)
1936
+ , real_cap, raw_pos, n, insert_range_proxy);
1937
+ }
1938
+
1939
+ return iterator(this->m_holder.start() + n_pos);
1940
+ }
1941
+
1942
+ template <class InsertionProxy>
1943
+ iterator priv_forward_range_insert
1944
+ (const pointer &pos, const size_type n, const InsertionProxy insert_range_proxy, allocator_v0)
1945
+ {
1946
+ //Check if we have enough memory or try to expand current memory
1947
+ const size_type remaining = this->m_holder.capacity() - this->m_holder.m_size;
1948
+
1949
+ if (n > remaining){
1950
+ //This will trigger an error
1951
+ throw_bad_alloc();
1952
+ }
1953
+ const size_type n_pos = pos - this->m_holder.start();
1954
+ T *const raw_pos = container_detail::to_raw_pointer(pos);
1955
+ this->priv_forward_range_insert_expand_forward(raw_pos, n, insert_range_proxy);
1956
+ return iterator(this->m_holder.start() + n_pos);
1957
+ }
1958
+
1959
+ template <class InsertionProxy>
1960
+ iterator priv_forward_range_insert
1961
+ (const pointer &pos, const size_type n, const InsertionProxy insert_range_proxy, allocator_v1)
1962
+ {
1963
+ //Check if we have enough memory or try to expand current memory
1964
+ const size_type remaining = this->m_holder.capacity() - this->m_holder.m_size;
1965
+ T *const raw_pos = container_detail::to_raw_pointer(pos);
1966
+
1967
+ if (n <= remaining){
1968
+ const size_type n_pos = raw_pos - container_detail::to_raw_pointer(this->m_holder.start());
1969
+ this->priv_forward_range_insert_expand_forward
1970
+ (raw_pos, n, insert_range_proxy);
1971
+ return iterator(this->m_holder.start() + n_pos);
1972
+ }
1973
+ else{
1974
+ return this->priv_forward_range_insert_no_capacity(pos, n, insert_range_proxy, alloc_version());
1975
+ }
1976
+ }
1977
+
1978
+ template <class InsertionProxy>
1979
+ iterator priv_forward_range_insert
1980
+ (const pointer &pos, const size_type n, const InsertionProxy insert_range_proxy, allocator_v2)
1981
+ {
1982
+ //Check if we have enough memory or try to expand current memory
1983
+ const size_type remaining = this->m_holder.capacity() - this->m_holder.m_size;
1984
+
1985
+ bool same_buffer_start = n <= remaining;
1986
+ if (!same_buffer_start){
1987
+ return priv_forward_range_insert_no_capacity(pos, n, insert_range_proxy, alloc_version());
1988
+ }
1989
+ else{
1990
+ //Expand forward
1991
+ T *const raw_pos = container_detail::to_raw_pointer(pos);
1992
+ const size_type n_pos = raw_pos - container_detail::to_raw_pointer(this->m_holder.start());
1993
+ this->priv_forward_range_insert_expand_forward(raw_pos, n, insert_range_proxy);
1994
+ return iterator(this->m_holder.start() + n_pos);
1995
+ }
1996
+ }
1997
+
1998
+ template <class InsertionProxy>
1999
+ iterator priv_forward_range_insert_at_end
2000
+ (const size_type n, const InsertionProxy insert_range_proxy, allocator_v0)
2001
+ {
2002
+ //Check if we have enough memory or try to expand current memory
2003
+ const size_type remaining = this->m_holder.capacity() - this->m_holder.m_size;
2004
+
2005
+ if (n > remaining){
2006
+ //This will trigger an error
2007
+ throw_bad_alloc();
2008
+ }
2009
+ this->priv_forward_range_insert_at_end_expand_forward(n, insert_range_proxy);
2010
+ return this->end();
2011
+ }
2012
+
2013
+ template <class InsertionProxy>
2014
+ iterator priv_forward_range_insert_at_end
2015
+ (const size_type n, const InsertionProxy insert_range_proxy, allocator_v1)
2016
+ {
2017
+ return this->priv_forward_range_insert(vector_iterator_get_ptr(this->cend()), n, insert_range_proxy, allocator_v1());
2018
+ }
2019
+
2020
+ template <class InsertionProxy>
2021
+ iterator priv_forward_range_insert_at_end
2022
+ (const size_type n, const InsertionProxy insert_range_proxy, allocator_v2)
2023
+ {
2024
+ return this->priv_forward_range_insert(vector_iterator_get_ptr(this->cend()), n, insert_range_proxy, allocator_v2());
2025
+ }
2026
+
2027
+ //Absolutely experimental. This function might change, disappear or simply crash!
2028
+ template<class BiDirPosConstIt, class BiDirSkipConstIt, class BiDirValueIt>
2029
+ void priv_insert_ordered_at( size_type element_count, BiDirPosConstIt last_position_it
2030
+ , bool do_skip, BiDirSkipConstIt last_skip_it, BiDirValueIt last_value_it)
2031
+ {
2032
+ const size_type old_size_pos = this->size();
2033
+ this->reserve(old_size_pos + element_count);
2034
+ T* const begin_ptr = container_detail::to_raw_pointer(this->m_holder.start());
2035
+ size_type insertions_left = element_count;
2036
+ size_type next_pos = old_size_pos;
2037
+ size_type hole_size = element_count;
2038
+
2039
+ //Exception rollback. If any copy throws before the hole is filled, values
2040
+ //already inserted/copied at the end of the buffer will be destroyed.
2041
+ typename value_traits::ArrayDestructor past_hole_values_destroyer
2042
+ (begin_ptr + old_size_pos + element_count, this->m_holder.alloc(), size_type(0u));
2043
+ //Loop for each insertion backwards, first moving the elements after the insertion point,
2044
+ //then inserting the element.
2045
+ while(insertions_left){
2046
+ if(do_skip){
2047
+ size_type n = *(--last_skip_it);
2048
+ std::advance(last_value_it, -difference_type(n));
2049
+ }
2050
+ const size_type pos = static_cast<size_type>(*(--last_position_it));
2051
+ BOOST_ASSERT(pos <= old_size_pos);
2052
+ //If needed shift the range after the insertion point and the previous insertion point.
2053
+ //Function will take care if the shift crosses the size() boundary, using copy/move
2054
+ //or uninitialized copy/move if necessary.
2055
+ size_type new_hole_size = (pos != next_pos)
2056
+ ? priv_insert_ordered_at_shift_range(pos, next_pos, this->size(), insertions_left)
2057
+ : hole_size
2058
+ ;
2059
+ if(new_hole_size > 0){
2060
+ //The hole was reduced by priv_insert_ordered_at_shift_range so expand exception rollback range backwards
2061
+ past_hole_values_destroyer.increment_size_backwards(next_pos - pos);
2062
+ //Insert the new value in the hole
2063
+ allocator_traits_type::construct(this->m_holder.alloc(), begin_ptr + pos + insertions_left - 1, *(--last_value_it));
2064
+ --new_hole_size;
2065
+ if(new_hole_size == 0){
2066
+ //Hole was just filled, disable exception rollback and change vector size
2067
+ past_hole_values_destroyer.release();
2068
+ this->m_holder.m_size += element_count;
2069
+ }
2070
+ else{
2071
+ //The hole was reduced by the new insertion by one
2072
+ past_hole_values_destroyer.increment_size_backwards(size_type(1u));
2073
+ }
2074
+ }
2075
+ else{
2076
+ if(hole_size){
2077
+ //Hole was just filled by priv_insert_ordered_at_shift_range, disable exception rollback and change vector size
2078
+ past_hole_values_destroyer.release();
2079
+ this->m_holder.m_size += element_count;
2080
+ }
2081
+ //Insert the new value in the already constructed range
2082
+ begin_ptr[pos + insertions_left - 1] = *(--last_value_it);
2083
+ }
2084
+ --insertions_left;
2085
+ hole_size = new_hole_size;
2086
+ next_pos = pos;
2087
+ }
2088
+ }
2089
+
2090
+ //Takes the range pointed by [first_pos, last_pos) and shifts it to the right
2091
+ //by 'shift_count'. 'limit_pos' marks the end of constructed elements.
2092
+ //
2093
+ //Precondition: first_pos <= last_pos <= limit_pos
2094
+ //
2095
+ //The shift operation might cross limit_pos so elements to moved beyond limit_pos
2096
+ //are uninitialized_moved with an allocator. Other elements are moved.
2097
+ //
2098
+ //The shift operation might left uninitialized elements after limit_pos
2099
+ //and the number of uninitialized elements is returned by the function.
2100
+ //
2101
+ //Old situation:
2102
+ // first_pos last_pos old_limit
2103
+ // | | |
2104
+ // ____________V_______V__________________V_____________
2105
+ //| prefix | range | suffix |raw_mem ~
2106
+ //|____________|_______|__________________|_____________~
2107
+ //
2108
+ //New situation in Case Allocator (hole_size == 0):
2109
+ // range is moved through move assignments
2110
+ //
2111
+ // first_pos last_pos limit_pos
2112
+ // | | |
2113
+ // ____________V_______V__________________V_____________
2114
+ //| prefix' | | | range |suffix'|raw_mem ~
2115
+ //|________________+______|___^___|_______|_____________~
2116
+ // | |
2117
+ // |_>_>_>_>_>^
2118
+ //
2119
+ //
2120
+ //New situation in Case B (hole_size > 0):
2121
+ // range is moved through uninitialized moves
2122
+ //
2123
+ // first_pos last_pos limit_pos
2124
+ // | | |
2125
+ // ____________V_______V__________________V________________
2126
+ //| prefix' | | | [hole] | range |
2127
+ //|_______________________________________|________|___^___|
2128
+ // | |
2129
+ // |_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_>_^
2130
+ //
2131
+ //New situation in Case C (hole_size == 0):
2132
+ // range is moved through move assignments and uninitialized moves
2133
+ //
2134
+ // first_pos last_pos limit_pos
2135
+ // | | |
2136
+ // ____________V_______V__________________V___
2137
+ //| prefix' | | | range |
2138
+ //|___________________________________|___^___|
2139
+ // | |
2140
+ // |_>_>_>_>_>_>_>_>_>_>_>^
2141
+ size_type priv_insert_ordered_at_shift_range
2142
+ (size_type first_pos, size_type last_pos, size_type limit_pos, size_type shift_count)
2143
+ {
2144
+ BOOST_ASSERT(first_pos <= last_pos);
2145
+ BOOST_ASSERT(last_pos <= limit_pos);
2146
+ //
2147
+ T* const begin_ptr = container_detail::to_raw_pointer(this->m_holder.start());
2148
+ T* const first_ptr = begin_ptr + first_pos;
2149
+ T* const last_ptr = begin_ptr + last_pos;
2150
+
2151
+ size_type hole_size = 0;
2152
+ //Case Allocator:
2153
+ if((last_pos + shift_count) <= limit_pos){
2154
+ //All move assigned
2155
+ boost::move_backward(first_ptr, last_ptr, last_ptr + shift_count);
2156
+ }
2157
+ //Case B:
2158
+ else if((first_pos + shift_count) >= limit_pos){
2159
+ //All uninitialized_moved
2160
+ ::boost::container::uninitialized_move_alloc
2161
+ (this->m_holder.alloc(), first_ptr, last_ptr, first_ptr + shift_count);
2162
+ hole_size = last_pos + shift_count - limit_pos;
2163
+ }
2164
+ //Case C:
2165
+ else{
2166
+ //Some uninitialized_moved
2167
+ T* const limit_ptr = begin_ptr + limit_pos;
2168
+ T* const boundary_ptr = limit_ptr - shift_count;
2169
+ ::boost::container::uninitialized_move_alloc(this->m_holder.alloc(), boundary_ptr, last_ptr, limit_ptr);
2170
+ //The rest is move assigned
2171
+ boost::move_backward(first_ptr, boundary_ptr, limit_ptr);
2172
+ }
2173
+ return hole_size;
2174
+ }
2175
+
2176
+ private:
2177
+ template <class InsertionProxy>
2178
+ void priv_forward_range_insert_at_end_expand_forward(const size_type n, InsertionProxy insert_range_proxy)
2179
+ {
2180
+ T* const old_finish = container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size;
2181
+ insert_range_proxy.uninitialized_copy_n_and_update(old_finish, n);
2182
+ this->m_holder.m_size += n;
2183
+ }
2184
+
2185
+ template <class InsertionProxy>
2186
+ void priv_forward_range_insert_expand_forward(T* const pos, const size_type n, InsertionProxy insert_range_proxy)
2187
+ {
2188
+ //n can't be 0, because there is nothing to do in that case
2189
+ if(!n) return;
2190
+ //There is enough memory
2191
+ T* const old_finish = container_detail::to_raw_pointer(this->m_holder.start()) + this->m_holder.m_size;
2192
+ const size_type elems_after = old_finish - pos;
2193
+
2194
+ if (!elems_after){
2195
+ insert_range_proxy.uninitialized_copy_n_and_update(old_finish, n);
2196
+ this->m_holder.m_size += n;
2197
+ }
2198
+ else if (elems_after >= n){
2199
+ //New elements can be just copied.
2200
+ //Move to uninitialized memory last objects
2201
+ ::boost::container::uninitialized_move_alloc
2202
+ (this->m_holder.alloc(), old_finish - n, old_finish, old_finish);
2203
+ this->m_holder.m_size += n;
2204
+ //Copy previous to last objects to the initialized end
2205
+ boost::move_backward(pos, old_finish - n, old_finish);
2206
+ //Insert new objects in the pos
2207
+ insert_range_proxy.copy_n_and_update(pos, n);
2208
+ }
2209
+ else {
2210
+ //The new elements don't fit in the [pos, end()) range.
2211
+
2212
+ //Copy old [pos, end()) elements to the uninitialized memory (a gap is created)
2213
+ ::boost::container::uninitialized_move_alloc(this->m_holder.alloc(), pos, old_finish, pos + n);
2214
+ BOOST_TRY{
2215
+ //Copy first new elements in pos (gap is still there)
2216
+ insert_range_proxy.copy_n_and_update(pos, elems_after);
2217
+ //Copy to the beginning of the unallocated zone the last new elements (the gap is closed).
2218
+ insert_range_proxy.uninitialized_copy_n_and_update(old_finish, n - elems_after);
2219
+ this->m_holder.m_size += n;
2220
+ }
2221
+ BOOST_CATCH(...){
2222
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), pos + n, elems_after);
2223
+ BOOST_RETHROW
2224
+ }
2225
+ BOOST_CATCH_END
2226
+ }
2227
+ }
2228
+
2229
+ template <class InsertionProxy>
2230
+ void priv_forward_range_insert_new_allocation
2231
+ (T* const new_start, size_type new_cap, T* const pos, const size_type n, InsertionProxy insert_range_proxy)
2232
+ {
2233
+ //n can be zero, if we want to reallocate!
2234
+ T *new_finish = new_start;
2235
+ T *old_finish;
2236
+ //Anti-exception rollbacks
2237
+ typename value_traits::ArrayDeallocator scoped_alloc(new_start, this->m_holder.alloc(), new_cap);
2238
+ typename value_traits::ArrayDestructor constructed_values_destroyer(new_start, this->m_holder.alloc(), 0u);
2239
+
2240
+ //Initialize with [begin(), pos) old buffer
2241
+ //the start of the new buffer
2242
+ T *old_buffer = container_detail::to_raw_pointer(this->m_holder.start());
2243
+ if(old_buffer){
2244
+ new_finish = ::boost::container::uninitialized_move_alloc
2245
+ (this->m_holder.alloc(), container_detail::to_raw_pointer(this->m_holder.start()), pos, old_finish = new_finish);
2246
+ constructed_values_destroyer.increment_size(new_finish - old_finish);
2247
+ }
2248
+ //Initialize new objects, starting from previous point
2249
+ insert_range_proxy.uninitialized_copy_n_and_update(old_finish = new_finish, n);
2250
+ new_finish += n;
2251
+ constructed_values_destroyer.increment_size(new_finish - old_finish);
2252
+ //Initialize from the rest of the old buffer,
2253
+ //starting from previous point
2254
+ if(old_buffer){
2255
+ new_finish = ::boost::container::uninitialized_move_alloc
2256
+ (this->m_holder.alloc(), pos, old_buffer + this->m_holder.m_size, new_finish);
2257
+ //Destroy and deallocate old elements
2258
+ //If there is allocated memory, destroy and deallocate
2259
+ if(!value_traits::trivial_dctr_after_move)
2260
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), old_buffer, this->m_holder.m_size);
2261
+ this->m_holder.alloc().deallocate(this->m_holder.start(), this->m_holder.capacity());
2262
+ }
2263
+ this->m_holder.start(new_start);
2264
+ this->m_holder.m_size = new_finish - new_start;
2265
+ this->m_holder.capacity(new_cap);
2266
+ //All construction successful, disable rollbacks
2267
+ constructed_values_destroyer.release();
2268
+ scoped_alloc.release();
2269
+ }
2270
+
2271
+ template <class InsertionProxy>
2272
+ void priv_forward_range_insert_expand_backwards
2273
+ (T* const new_start, const size_type new_capacity,
2274
+ T* const pos, const size_type n, InsertionProxy insert_range_proxy)
2275
+ {
2276
+ //n can be zero to just expand capacity
2277
+ //Backup old data
2278
+ T* const old_start = container_detail::to_raw_pointer(this->m_holder.start());
2279
+ T* const old_finish = old_start + this->m_holder.m_size;
2280
+ const size_type old_size = this->m_holder.m_size;
2281
+
2282
+ //We can have 8 possibilities:
2283
+ const size_type elemsbefore = static_cast<size_type>(pos - old_start);
2284
+ const size_type s_before = static_cast<size_type>(old_start - new_start);
2285
+ const size_type before_plus_new = elemsbefore + n;
2286
+
2287
+ //Update the vector buffer information to a safe state
2288
+ this->m_holder.start(new_start);
2289
+ this->m_holder.capacity(new_capacity);
2290
+ this->m_holder.m_size = 0;
2291
+
2292
+ //If anything goes wrong, this object will destroy
2293
+ //all the old objects to fulfill previous vector state
2294
+ typename value_traits::OldArrayDestructor old_values_destroyer(old_start, this->m_holder.alloc(), old_size);
2295
+ //Check if s_before is big enough to hold the beginning of old data + new data
2296
+ if(s_before >= before_plus_new){
2297
+ //Copy first old values before pos, after that the new objects
2298
+ T *const new_elem_pos = ::boost::container::uninitialized_move_alloc(this->m_holder.alloc(), old_start, pos, new_start);
2299
+ this->m_holder.m_size = elemsbefore;
2300
+ insert_range_proxy.uninitialized_copy_n_and_update(new_elem_pos, n);
2301
+ this->m_holder.m_size += n;
2302
+ //Check if s_before is so big that even copying the old data + new data
2303
+ //there is a gap between the new data and the old data
2304
+ const size_type new_size = old_size + n;
2305
+ if(s_before >= new_size){
2306
+ //Old situation:
2307
+ // _________________________________________________________
2308
+ //| raw_mem | old_begin | old_end |
2309
+ //| __________________________________|___________|_________|
2310
+ //
2311
+ //New situation:
2312
+ // _________________________________________________________
2313
+ //| old_begin | new | old_end | raw_mem |
2314
+ //|___________|__________|_________|________________________|
2315
+ //
2316
+ //Now initialize the rest of memory with the last old values
2317
+ ::boost::container::uninitialized_move_alloc
2318
+ (this->m_holder.alloc(), pos, old_finish, new_start + before_plus_new);
2319
+ //All new elements correctly constructed, avoid new element destruction
2320
+ this->m_holder.m_size = new_size;
2321
+ //Old values destroyed automatically with "old_values_destroyer"
2322
+ //when "old_values_destroyer" goes out of scope unless the have trivial
2323
+ //destructor after move.
2324
+ if(value_traits::trivial_dctr_after_move)
2325
+ old_values_destroyer.release();
2326
+ }
2327
+ //s_before is so big that divides old_end
2328
+ else{
2329
+ //Old situation:
2330
+ // __________________________________________________
2331
+ //| raw_mem | old_begin | old_end |
2332
+ //| ___________________________|___________|_________|
2333
+ //
2334
+ //New situation:
2335
+ // __________________________________________________
2336
+ //| old_begin | new | old_end | raw_mem |
2337
+ //|___________|__________|_________|_________________|
2338
+ //
2339
+ //Now initialize the rest of memory with the last old values
2340
+ //All new elements correctly constructed, avoid new element destruction
2341
+ const size_type raw_gap = s_before - before_plus_new;
2342
+ //Now initialize the rest of s_before memory with the
2343
+ //first of elements after new values
2344
+ ::boost::container::uninitialized_move_alloc_n
2345
+ (this->m_holder.alloc(), pos, raw_gap, new_start + before_plus_new);
2346
+ //Update size since we have a contiguous buffer
2347
+ this->m_holder.m_size = old_size + s_before;
2348
+ //All new elements correctly constructed, avoid old element destruction
2349
+ old_values_destroyer.release();
2350
+ //Now copy remaining last objects in the old buffer begin
2351
+ T * const to_destroy = ::boost::move(pos + raw_gap, old_finish, old_start);
2352
+ //Now destroy redundant elements except if they were moved and
2353
+ //they have trivial destructor after move
2354
+ size_type n_destroy = old_finish - to_destroy;
2355
+ if(!value_traits::trivial_dctr_after_move)
2356
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), to_destroy, n_destroy);
2357
+ this->m_holder.m_size -= n_destroy;
2358
+ }
2359
+ }
2360
+ else{
2361
+ //Check if we have to do the insertion in two phases
2362
+ //since maybe s_before is not big enough and
2363
+ //the buffer was expanded both sides
2364
+ //
2365
+ //Old situation:
2366
+ // _________________________________________________
2367
+ //| raw_mem | old_begin + old_end | raw_mem |
2368
+ //|_________|_____________________|_________________|
2369
+ //
2370
+ //New situation with do_after:
2371
+ // _________________________________________________
2372
+ //| old_begin + new + old_end | raw_mem |
2373
+ //|___________________________________|_____________|
2374
+ //
2375
+ //New without do_after:
2376
+ // _________________________________________________
2377
+ //| old_begin + new + old_end | raw_mem |
2378
+ //|____________________________|____________________|
2379
+ //
2380
+ const bool do_after = n > s_before;
2381
+
2382
+ //Now we can have two situations: the raw_mem of the
2383
+ //beginning divides the old_begin, or the new elements:
2384
+ if (s_before <= elemsbefore) {
2385
+ //The raw memory divides the old_begin group:
2386
+ //
2387
+ //If we need two phase construction (do_after)
2388
+ //new group is divided in new = new_beg + new_end groups
2389
+ //In this phase only new_beg will be inserted
2390
+ //
2391
+ //Old situation:
2392
+ // _________________________________________________
2393
+ //| raw_mem | old_begin | old_end | raw_mem |
2394
+ //|_________|___________|_________|_________________|
2395
+ //
2396
+ //New situation with do_after(1):
2397
+ //This is not definitive situation, the second phase
2398
+ //will include
2399
+ // _________________________________________________
2400
+ //| old_begin | new_beg | old_end | raw_mem |
2401
+ //|___________|_________|_________|_________________|
2402
+ //
2403
+ //New situation without do_after:
2404
+ // _________________________________________________
2405
+ //| old_begin | new | old_end | raw_mem |
2406
+ //|___________|_____|_________|_____________________|
2407
+ //
2408
+ //Copy the first part of old_begin to raw_mem
2409
+ ::boost::container::uninitialized_move_alloc_n
2410
+ (this->m_holder.alloc(), old_start, s_before, new_start);
2411
+ //The buffer is all constructed until old_end,
2412
+ //release destroyer and update size
2413
+ old_values_destroyer.release();
2414
+ this->m_holder.m_size = old_size + s_before;
2415
+ //Now copy the second part of old_begin overwriting itself
2416
+ T *const next = ::boost::move(old_start + s_before, pos, old_start);
2417
+ if(do_after){
2418
+ //Now copy the new_beg elements
2419
+ insert_range_proxy.copy_n_and_update(next, s_before);
2420
+ }
2421
+ else{
2422
+ //Now copy the all the new elements
2423
+ insert_range_proxy.copy_n_and_update(next, n);
2424
+ //Now displace old_end elements
2425
+ T* const move_end = ::boost::move(pos, old_finish, next + n);
2426
+ //Destroy remaining moved elements from old_end except if
2427
+ //they have trivial destructor after being moved
2428
+ const size_type n_destroy = s_before - n;
2429
+ if(!value_traits::trivial_dctr_after_move)
2430
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), move_end, n_destroy);
2431
+ this->m_holder.m_size -= n_destroy;
2432
+ }
2433
+ }
2434
+ else {
2435
+ //If we have to expand both sides,
2436
+ //we will play if the first new values so
2437
+ //calculate the upper bound of new values
2438
+
2439
+ //The raw memory divides the new elements
2440
+ //
2441
+ //If we need two phase construction (do_after)
2442
+ //new group is divided in new = new_beg + new_end groups
2443
+ //In this phase only new_beg will be inserted
2444
+ //
2445
+ //Old situation:
2446
+ // _______________________________________________________
2447
+ //| raw_mem | old_begin | old_end | raw_mem |
2448
+ //|_______________|___________|_________|_________________|
2449
+ //
2450
+ //New situation with do_after():
2451
+ // ____________________________________________________
2452
+ //| old_begin | new_beg | old_end | raw_mem |
2453
+ //|___________|_______________|_________|______________|
2454
+ //
2455
+ //New situation without do_after:
2456
+ // ______________________________________________________
2457
+ //| old_begin | new | old_end | raw_mem |
2458
+ //|___________|_____|_________|__________________________|
2459
+ //
2460
+ //First copy whole old_begin and part of new to raw_mem
2461
+ T * const new_pos = ::boost::container::uninitialized_move_alloc
2462
+ (this->m_holder.alloc(), old_start, pos, new_start);
2463
+ this->m_holder.m_size = elemsbefore;
2464
+ const size_type mid_n = s_before - elemsbefore;
2465
+ insert_range_proxy.uninitialized_copy_n_and_update(new_pos, mid_n);
2466
+ //The buffer is all constructed until old_end,
2467
+ //release destroyer
2468
+ this->m_holder.m_size = old_size + s_before;
2469
+ old_values_destroyer.release();
2470
+
2471
+ if(do_after){
2472
+ //Copy new_beg part
2473
+ insert_range_proxy.copy_n_and_update(old_start, elemsbefore);
2474
+ }
2475
+ else{
2476
+ //Copy all new elements
2477
+ const size_type rest_new = n - mid_n;
2478
+ insert_range_proxy.copy_n_and_update(old_start, rest_new);
2479
+ T* move_start = old_start + rest_new;
2480
+ //Displace old_end
2481
+ T* move_end = ::boost::move(pos, old_finish, move_start);
2482
+ //Destroy remaining moved elements from old_end except if they
2483
+ //have trivial destructor after being moved
2484
+ size_type n_destroy = s_before - n;
2485
+ if(!value_traits::trivial_dctr_after_move)
2486
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), move_end, n_destroy);
2487
+ this->m_holder.m_size -= n_destroy;
2488
+ }
2489
+ }
2490
+
2491
+ //This is only executed if two phase construction is needed
2492
+ if(do_after){
2493
+ //The raw memory divides the new elements
2494
+ //
2495
+ //Old situation:
2496
+ // ______________________________________________________
2497
+ //| raw_mem | old_begin | old_end | raw_mem |
2498
+ //|______________|___________|____________|______________|
2499
+ //
2500
+ //New situation with do_after(1):
2501
+ // _______________________________________________________
2502
+ //| old_begin + new_beg | new_end |old_end | raw_mem |
2503
+ //|__________________________|_________|________|_________|
2504
+ //
2505
+ //New situation with do_after(2):
2506
+ // ______________________________________________________
2507
+ //| old_begin + new | old_end |raw |
2508
+ //|_______________________________________|_________|____|
2509
+ //
2510
+ const size_type n_after = n - s_before;
2511
+ const size_type elemsafter = old_size - elemsbefore;
2512
+
2513
+ //We can have two situations:
2514
+ if (elemsafter >= n_after){
2515
+ //The raw_mem from end will divide displaced old_end
2516
+ //
2517
+ //Old situation:
2518
+ // ______________________________________________________
2519
+ //| raw_mem | old_begin | old_end | raw_mem |
2520
+ //|______________|___________|____________|______________|
2521
+ //
2522
+ //New situation with do_after(1):
2523
+ // _______________________________________________________
2524
+ //| old_begin + new_beg | new_end |old_end | raw_mem |
2525
+ //|__________________________|_________|________|_________|
2526
+ //
2527
+ //First copy the part of old_end raw_mem
2528
+ T* finish_n = old_finish - n_after;
2529
+ ::boost::container::uninitialized_move_alloc
2530
+ (this->m_holder.alloc(), finish_n, old_finish, old_finish);
2531
+ this->m_holder.m_size += n_after;
2532
+ //Displace the rest of old_end to the new position
2533
+ boost::move_backward(pos, finish_n, old_finish);
2534
+ //Now overwrite with new_end
2535
+ //The new_end part is [first + (n - n_after), last)
2536
+ insert_range_proxy.copy_n_and_update(pos, n_after);
2537
+ }
2538
+ else {
2539
+ //The raw_mem from end will divide new_end part
2540
+ //
2541
+ //Old situation:
2542
+ // _____________________________________________________________
2543
+ //| raw_mem | old_begin | old_end | raw_mem |
2544
+ //|______________|___________|____________|_____________________|
2545
+ //
2546
+ //New situation with do_after(2):
2547
+ // _____________________________________________________________
2548
+ //| old_begin + new_beg | new_end |old_end | raw_mem |
2549
+ //|__________________________|_______________|________|_________|
2550
+ //
2551
+
2552
+ const size_type mid_last_dist = n_after - elemsafter;
2553
+ //First initialize data in raw memory
2554
+
2555
+ //Copy to the old_end part to the uninitialized zone leaving a gap.
2556
+ ::boost::container::uninitialized_move_alloc
2557
+ (this->m_holder.alloc(), pos, old_finish, old_finish + mid_last_dist);
2558
+
2559
+ BOOST_TRY{
2560
+ //Copy the first part to the already constructed old_end zone
2561
+ insert_range_proxy.copy_n_and_update(pos, elemsafter);
2562
+ //Copy the rest to the uninitialized zone filling the gap
2563
+ insert_range_proxy.uninitialized_copy_n_and_update(old_finish, mid_last_dist);
2564
+ this->m_holder.m_size += n_after;
2565
+ }
2566
+ BOOST_CATCH(...){
2567
+ boost::container::destroy_alloc_n(this->get_stored_allocator(), pos, mid_last_dist);
2568
+ BOOST_RETHROW
2569
+ }
2570
+ BOOST_CATCH_END
2571
+ /*
2572
+ size_type mid_last_dist = n_after - elemsafter;
2573
+ //First initialize data in raw memory
2574
+
2575
+ //The new_end part is [first + (n - n_after), last)
2576
+ insert_range_proxy.uninitialized_copy_last_and_update(old_finish, elemsafter);
2577
+ this->m_holder.m_size += mid_last_dist;
2578
+ ::boost::container::uninitialized_move_alloc
2579
+ (this->m_holder.alloc(), pos, old_finish, old_finish + mid_last_dist);
2580
+ this->m_holder.m_size += n_after - mid_last_dist;
2581
+ //Now copy the part of new_end over constructed elements
2582
+ insert_range_proxy.copy_remaining_to(pos);*/
2583
+ }
2584
+ }
2585
+ }
2586
+ }
2587
+
2588
+ void priv_check_range(size_type n) const
2589
+ {
2590
+ //If n is out of range, throw an out_of_range exception
2591
+ if (n >= this->size()){
2592
+ throw_out_of_range("vector::at out of range");
2593
+ }
2594
+ }
2595
+
2596
+ #ifdef BOOST_CONTAINER_VECTOR_ALLOC_STATS
2597
+ public:
2598
+ unsigned int num_expand_fwd;
2599
+ unsigned int num_expand_bwd;
2600
+ unsigned int num_shrink;
2601
+ unsigned int num_alloc;
2602
+ void reset_alloc_stats()
2603
+ { num_expand_fwd = num_expand_bwd = num_alloc = 0, num_shrink = 0; }
2604
+ #endif
2605
+ /// @endcond
2606
+ };
2607
+
2608
+ template <class T, class Allocator>
2609
+ inline bool
2610
+ operator==(const vector<T, Allocator>& x, const vector<T, Allocator>& y)
2611
+ {
2612
+ //Check first size and each element if needed
2613
+ return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin());
2614
+ }
2615
+
2616
+ template <class T, class Allocator>
2617
+ inline bool
2618
+ operator!=(const vector<T, Allocator>& x, const vector<T, Allocator>& y)
2619
+ {
2620
+ //Check first size and each element if needed
2621
+ return x.size() != y.size() || !std::equal(x.begin(), x.end(), y.begin());
2622
+ }
2623
+
2624
+ template <class T, class Allocator>
2625
+ inline bool
2626
+ operator<(const vector<T, Allocator>& x, const vector<T, Allocator>& y)
2627
+ {
2628
+ return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
2629
+ }
2630
+
2631
+ template <class T, class Allocator>
2632
+ inline void swap(vector<T, Allocator>& x, vector<T, Allocator>& y)
2633
+ { x.swap(y); }
2634
+
2635
+ }}
2636
+
2637
+ /// @cond
2638
+
2639
+ namespace boost {
2640
+
2641
+
2642
+ //!has_trivial_destructor_after_move<> == true_type
2643
+ //!specialization for optimizations
2644
+ template <class T, class Allocator>
2645
+ struct has_trivial_destructor_after_move<boost::container::vector<T, Allocator> >
2646
+ : public ::boost::has_trivial_destructor_after_move<Allocator>
2647
+ {};
2648
+
2649
+
2650
+ }
2651
+
2652
+ //#define BOOST_CONTAINER_PUT_SWAP_OVERLOAD_IN_NAMESPACE_STD
2653
+
2654
+ #ifdef BOOST_CONTAINER_PUT_SWAP_OVERLOAD_IN_NAMESPACE_STD
2655
+
2656
+ namespace std {
2657
+
2658
+ template <class T, class Allocator>
2659
+ inline void swap(boost::container::vector<T, Allocator>& x, boost::container::vector<T, Allocator>& y)
2660
+ { x.swap(y); }
2661
+
2662
+ } //namespace std {
2663
+
2664
+ #endif
2665
+
2666
+ /// @endcond
2667
+
2668
+ #include <boost/container/detail/config_end.hpp>
2669
+
2670
+ #endif // #ifndef BOOST_CONTAINER_CONTAINER_VECTOR_HPP
2671
+