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,22 @@
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/interprocess for documentation.
8
+ //
9
+ //////////////////////////////////////////////////////////////////////////////
10
+
11
+ #ifndef BOOST_INTRUSIVE_DETAIL_WRKRND_HPP
12
+ #define BOOST_INTRUSIVE_DETAIL_WRKRND_HPP
13
+
14
+ #include <boost/intrusive/detail/config_begin.hpp>
15
+
16
+ #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
17
+ #define BOOST_INTRUSIVE_PERFECT_FORWARDING
18
+ #endif
19
+
20
+ #include <boost/intrusive/detail/config_end.hpp>
21
+
22
+ #endif //#ifndef BOOST_INTRUSIVE_DETAIL_WRKRND_HPP
@@ -0,0 +1,3110 @@
1
+ /////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright Ion Gaztanaga 2006-2012
4
+ //
5
+ // Distributed under the Boost Software License, Version 1.0.
6
+ // (See accompanying file LICENSE_1_0.txt or copy at
7
+ // http://www.boost.org/LICENSE_1_0.txt)
8
+ //
9
+ // See http://www.boost.org/libs/intrusive for documentation.
10
+ //
11
+ /////////////////////////////////////////////////////////////////////////////
12
+ #ifndef BOOST_INTRUSIVE_HASHTABLE_HPP
13
+ #define BOOST_INTRUSIVE_HASHTABLE_HPP
14
+
15
+ #include <boost/intrusive/detail/config_begin.hpp>
16
+ //std C++
17
+ #include <functional> //std::equal_to
18
+ #include <utility> //std::pair
19
+ #include <algorithm> //std::swap, std::lower_bound, std::upper_bound
20
+ #include <cstddef> //std::size_t
21
+ //boost
22
+ #include <boost/intrusive/detail/assert.hpp>
23
+ #include <boost/static_assert.hpp>
24
+ #include <boost/functional/hash.hpp>
25
+ #include <boost/pointer_cast.hpp>
26
+ //General intrusive utilities
27
+ #include <boost/intrusive/intrusive_fwd.hpp>
28
+ #include <boost/intrusive/detail/hashtable_node.hpp>
29
+ #include <boost/intrusive/detail/transform_iterator.hpp>
30
+ #include <boost/intrusive/link_mode.hpp>
31
+ #include <boost/intrusive/detail/ebo_functor_holder.hpp>
32
+ #include <boost/intrusive/detail/clear_on_destructor_base.hpp>
33
+ #include <boost/intrusive/detail/utilities.hpp>
34
+ //Implementation utilities
35
+ #include <boost/intrusive/trivial_value_traits.hpp>
36
+ #include <boost/intrusive/unordered_set_hook.hpp>
37
+ #include <boost/intrusive/slist.hpp>
38
+ #include <boost/intrusive/pointer_traits.hpp>
39
+ #include <boost/intrusive/detail/mpl.hpp>
40
+ #include <boost/type_traits.hpp>
41
+ #include <boost/move/move.hpp>
42
+
43
+ namespace boost {
44
+ namespace intrusive {
45
+
46
+ /// @cond
47
+
48
+ namespace detail {
49
+
50
+ struct hash_bool_flags
51
+ {
52
+ static const std::size_t unique_keys_pos = 1u;
53
+ static const std::size_t constant_time_size_pos = 2u;
54
+ static const std::size_t power_2_buckets_pos = 4u;
55
+ static const std::size_t cache_begin_pos = 8u;
56
+ static const std::size_t compare_hash_pos = 16u;
57
+ static const std::size_t incremental_pos = 32u;
58
+ };
59
+
60
+ template
61
+ < class ValueTraits
62
+ , class Hash
63
+ , class Equal
64
+ , class SizeType
65
+ , class BucketTraits
66
+ , std::size_t BoolFlags
67
+ >
68
+ struct usetopt
69
+ {
70
+ typedef ValueTraits value_traits;
71
+ typedef Hash hash;
72
+ typedef Equal equal;
73
+ typedef SizeType size_type;
74
+ typedef BucketTraits bucket_traits;
75
+ static const std::size_t bool_flags = BoolFlags;
76
+ };
77
+
78
+ template
79
+ < class UsetOpt
80
+ , std::size_t BoolMask
81
+ >
82
+ struct usetopt_mask
83
+ {
84
+ typedef usetopt
85
+ <typename UsetOpt::value_traits
86
+ ,typename UsetOpt::hash
87
+ ,typename UsetOpt::equal
88
+ ,typename UsetOpt::size_type
89
+ ,typename UsetOpt::bucket_traits
90
+ ,UsetOpt::bool_flags & BoolMask
91
+ > type;
92
+ };
93
+
94
+ template <class NodeTraits>
95
+ struct hash_reduced_slist_node_traits
96
+ {
97
+ template <class U> static detail::one test(...);
98
+ template <class U> static detail::two test(typename U::reduced_slist_node_traits* = 0);
99
+ static const bool value = sizeof(test<NodeTraits>(0)) == sizeof(detail::two);
100
+ };
101
+
102
+ template <class NodeTraits>
103
+ struct apply_reduced_slist_node_traits
104
+ {
105
+ typedef typename NodeTraits::reduced_slist_node_traits type;
106
+ };
107
+
108
+ template <class NodeTraits>
109
+ struct reduced_slist_node_traits
110
+ {
111
+ typedef typename detail::eval_if_c
112
+ < hash_reduced_slist_node_traits<NodeTraits>::value
113
+ , apply_reduced_slist_node_traits<NodeTraits>
114
+ , detail::identity<NodeTraits>
115
+ >::type type;
116
+ };
117
+
118
+ template<class NodeTraits>
119
+ struct get_slist_impl
120
+ {
121
+ typedef trivial_value_traits<NodeTraits, normal_link> trivial_traits;
122
+
123
+ //Reducing symbol length
124
+ struct type : make_slist
125
+ < typename NodeTraits::node
126
+ , boost::intrusive::value_traits<trivial_traits>
127
+ , boost::intrusive::constant_time_size<false>
128
+ , boost::intrusive::size_type<typename boost::make_unsigned
129
+ <typename pointer_traits<typename NodeTraits::node_ptr>::difference_type>::type >
130
+ >::type
131
+ {};
132
+ };
133
+
134
+ template<class SupposedValueTraits>
135
+ struct real_from_supposed_value_traits
136
+ {
137
+ typedef typename detail::eval_if_c
138
+ < detail::external_value_traits_bool_is_true
139
+ <SupposedValueTraits>::value
140
+ , detail::eval_value_traits
141
+ <SupposedValueTraits>
142
+ , detail::identity
143
+ <SupposedValueTraits>
144
+ >::type type;
145
+ };
146
+
147
+ template<class SupposedValueTraits>
148
+ struct get_slist_impl_from_supposed_value_traits
149
+ {
150
+ typedef typename
151
+ real_from_supposed_value_traits
152
+ < SupposedValueTraits>::type real_value_traits;
153
+ typedef typename detail::get_node_traits
154
+ <real_value_traits>::type node_traits;
155
+ typedef typename get_slist_impl
156
+ <typename reduced_slist_node_traits
157
+ <node_traits>::type
158
+ >::type type;
159
+ };
160
+
161
+ template<class SupposedValueTraits>
162
+ struct unordered_bucket_impl
163
+ {
164
+ typedef typename
165
+ get_slist_impl_from_supposed_value_traits
166
+ <SupposedValueTraits>::type slist_impl;
167
+ typedef detail::bucket_impl<slist_impl> implementation_defined;
168
+ typedef implementation_defined type;
169
+ };
170
+
171
+ template<class SupposedValueTraits>
172
+ struct unordered_bucket_ptr_impl
173
+ {
174
+ typedef typename detail::get_node_traits
175
+ <SupposedValueTraits>::type::node_ptr node_ptr;
176
+ typedef typename unordered_bucket_impl
177
+ <SupposedValueTraits>::type bucket_type;
178
+
179
+ typedef typename pointer_traits
180
+ <node_ptr>::template rebind_pointer
181
+ < bucket_type >::type implementation_defined;
182
+ typedef implementation_defined type;
183
+ };
184
+
185
+ template <class T>
186
+ struct store_hash_bool
187
+ {
188
+ template<bool Add>
189
+ struct two_or_three {one _[2 + Add];};
190
+ template <class U> static one test(...);
191
+ template <class U> static two_or_three<U::store_hash> test (int);
192
+ static const std::size_t value = sizeof(test<T>(0));
193
+ };
194
+
195
+ template <class T>
196
+ struct store_hash_is_true
197
+ {
198
+ static const bool value = store_hash_bool<T>::value > sizeof(one)*2;
199
+ };
200
+
201
+ template <class T>
202
+ struct optimize_multikey_bool
203
+ {
204
+ template<bool Add>
205
+ struct two_or_three {one _[2 + Add];};
206
+ template <class U> static one test(...);
207
+ template <class U> static two_or_three<U::optimize_multikey> test (int);
208
+ static const std::size_t value = sizeof(test<T>(0));
209
+ };
210
+
211
+ template <class T>
212
+ struct optimize_multikey_is_true
213
+ {
214
+ static const bool value = optimize_multikey_bool<T>::value > sizeof(one)*2;
215
+ };
216
+
217
+ template<class Config>
218
+ struct bucket_plus_size
219
+ : public detail::size_holder //size_traits
220
+ < 0 != (Config::bool_flags & hash_bool_flags::constant_time_size_pos)
221
+ , typename Config::size_type>
222
+ {
223
+ typedef detail::size_holder
224
+ < 0 != (Config::bool_flags & hash_bool_flags::constant_time_size_pos)
225
+ , typename Config::size_type> size_traits;
226
+ typedef typename Config::bucket_traits bucket_traits;
227
+
228
+ template<class BucketTraits>
229
+ bucket_plus_size(BOOST_FWD_REF(BucketTraits) b_traits)
230
+ : bucket_traits_(::boost::forward<BucketTraits>(b_traits))
231
+ {}
232
+
233
+ bucket_plus_size & operator =(const bucket_plus_size &x)
234
+ {
235
+ this->size_traits::operator=(x);
236
+ bucket_traits_ = x.bucket_traits_;
237
+ return *this;
238
+ }
239
+ bucket_traits bucket_traits_;
240
+ };
241
+
242
+ template<class Config>
243
+ struct bucket_hash_t
244
+ : public detail::ebo_functor_holder<typename Config::hash> //hash
245
+ {
246
+ typedef typename Config::hash hasher;
247
+ typedef detail::size_holder
248
+ < 0 != (Config::bool_flags & hash_bool_flags::constant_time_size_pos)
249
+ , typename Config::size_type> size_traits;
250
+ typedef typename Config::bucket_traits bucket_traits;
251
+
252
+ template<class BucketTraits>
253
+ bucket_hash_t(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h)
254
+ : detail::ebo_functor_holder<hasher>(h), bucket_plus_size_(::boost::forward<BucketTraits>(b_traits))
255
+ {}
256
+
257
+ bucket_plus_size<Config> bucket_plus_size_;
258
+ };
259
+
260
+ template<class Config, bool>
261
+ struct bucket_hash_equal_t
262
+ : public detail::ebo_functor_holder<typename Config::equal>
263
+ {
264
+ typedef typename Config::equal equal;
265
+ typedef typename Config::hash hasher;
266
+ typedef typename Config::bucket_traits bucket_traits;
267
+
268
+ template<class BucketTraits>
269
+ bucket_hash_equal_t(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h, const equal &e)
270
+ : detail::ebo_functor_holder<typename Config::equal>(e)//equal()
271
+ , bucket_hash(::boost::forward<BucketTraits>(b_traits), h)
272
+ {}
273
+
274
+ template<class T>
275
+ void set_cache(T)
276
+ {}
277
+
278
+ bucket_hash_t<Config> bucket_hash;
279
+ };
280
+
281
+ template<class Config> //cache_begin == true version
282
+ struct bucket_hash_equal_t<Config, true>
283
+ : public detail::ebo_functor_holder<typename Config::equal>
284
+ {
285
+ typedef typename Config::equal equal;
286
+ typedef typename Config::hash hasher;
287
+ typedef typename Config::bucket_traits bucket_traits;
288
+ typedef typename unordered_bucket_ptr_impl
289
+ <typename Config::value_traits>::type bucket_ptr;
290
+
291
+ template<class BucketTraits>
292
+ bucket_hash_equal_t(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h, const equal &e)
293
+ : detail::ebo_functor_holder<typename Config::equal>(e) //equal()
294
+ , bucket_hash(::boost::forward<BucketTraits>(b_traits), h)
295
+ {}
296
+
297
+ void set_cache(const bucket_ptr & c)
298
+ { cached_begin_ = c; }
299
+
300
+ bucket_hash_t<Config> bucket_hash;
301
+ bucket_ptr cached_begin_;
302
+ };
303
+
304
+ template<class Config>
305
+ struct hashtable_data_t : public Config::value_traits
306
+ {
307
+ static const std::size_t bool_flags = Config::bool_flags;
308
+ typedef typename Config::value_traits value_traits;
309
+ typedef typename Config::equal equal;
310
+ typedef typename Config::hash hasher;
311
+ typedef typename Config::bucket_traits bucket_traits;
312
+
313
+ template<class BucketTraits>
314
+ hashtable_data_t( BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h
315
+ , const equal &e, const value_traits &val_traits)
316
+ : Config::value_traits(val_traits) //value_traits
317
+ , internal_(::boost::forward<BucketTraits>(b_traits), h, e)
318
+ {}
319
+ typedef typename detail::usetopt_mask
320
+ < Config
321
+ , detail::hash_bool_flags::constant_time_size_pos
322
+ | detail::hash_bool_flags::incremental_pos
323
+ >::type masked_config_t;
324
+ struct internal
325
+ : public detail::size_holder //split_traits
326
+ < 0 != (Config::bool_flags & hash_bool_flags::incremental_pos)
327
+ , typename Config::size_type>
328
+ {
329
+ template<class BucketTraits>
330
+ internal(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h, const equal &e)
331
+ : bucket_hash_equal_(::boost::forward<BucketTraits>(b_traits), h, e)
332
+ {}
333
+
334
+ bucket_hash_equal_t
335
+ < masked_config_t
336
+ , 0 != (bool_flags & hash_bool_flags::cache_begin_pos)
337
+ > bucket_hash_equal_;
338
+ } internal_;
339
+ };
340
+
341
+ struct insert_commit_data_impl
342
+ {
343
+ std::size_t hash;
344
+ };
345
+
346
+ template<class NodeTraits>
347
+ struct group_functions
348
+ {
349
+ typedef NodeTraits node_traits;
350
+ typedef unordered_group_adapter<node_traits> group_traits;
351
+ typedef typename node_traits::node_ptr node_ptr;
352
+ typedef typename node_traits::node node;
353
+ typedef typename reduced_slist_node_traits
354
+ <node_traits>::type reduced_node_traits;
355
+ typedef typename reduced_node_traits::node_ptr slist_node_ptr;
356
+ typedef typename reduced_node_traits::node slist_node;
357
+ typedef circular_slist_algorithms<group_traits> group_algorithms;
358
+
359
+ static node_ptr dcast_bucket_ptr(const slist_node_ptr &p)
360
+ { return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*p)); }
361
+
362
+ static slist_node_ptr get_bucket_before_begin
363
+ (const slist_node_ptr &bucket_beg, const slist_node_ptr &bucket_end, const node_ptr &p)
364
+ {
365
+ //First find the last node of p's group.
366
+ //This requires checking the first node of the next group or
367
+ //the bucket node.
368
+ node_ptr prev_node = p;
369
+ node_ptr nxt(node_traits::get_next(p));
370
+ while(!(bucket_beg <= nxt && nxt <= bucket_end) &&
371
+ (group_traits::get_next(nxt) == prev_node)){
372
+ prev_node = nxt;
373
+ nxt = node_traits::get_next(nxt);
374
+ }
375
+
376
+ //If we've reached the bucket node just return it.
377
+ if(bucket_beg <= nxt && nxt <= bucket_end){
378
+ return nxt;
379
+ }
380
+
381
+ //Otherwise, iterate using group links until the bucket node
382
+ node_ptr first_node_of_group = nxt;
383
+ node_ptr last_node_group = group_traits::get_next(first_node_of_group);
384
+ slist_node_ptr possible_end = node_traits::get_next(last_node_group);
385
+
386
+ while(!(bucket_beg <= possible_end && possible_end <= bucket_end)){
387
+ first_node_of_group = group_functions::dcast_bucket_ptr(possible_end);
388
+ last_node_group = group_traits::get_next(first_node_of_group);
389
+ possible_end = node_traits::get_next(last_node_group);
390
+ }
391
+ return possible_end;
392
+ }
393
+
394
+ static node_ptr get_prev_to_first_in_group(const slist_node_ptr &bucket_node, const node_ptr &first_in_group)
395
+ {
396
+ //Just iterate using group links and obtain the node
397
+ //before "first_in_group)"
398
+ node_ptr prev_node = group_functions::dcast_bucket_ptr(bucket_node);
399
+ node_ptr nxt(node_traits::get_next(prev_node));
400
+ while(nxt != first_in_group){
401
+ prev_node = group_traits::get_next(nxt);
402
+ nxt = node_traits::get_next(prev_node);
403
+ }
404
+ return prev_node;
405
+ }
406
+
407
+ static node_ptr get_first_in_group_of_last_in_group(const node_ptr &last_in_group)
408
+ {
409
+ //Just iterate using group links and obtain the node
410
+ //before "last_in_group"
411
+ node_ptr possible_first = group_traits::get_next(last_in_group);
412
+ node_ptr possible_first_prev = group_traits::get_next(possible_first);
413
+ // The deleted node is at the end of the group, so the
414
+ // node in the group pointing to it is at the beginning
415
+ // of the group. Find that to change its pointer.
416
+ while(possible_first_prev != last_in_group){
417
+ possible_first = possible_first_prev;
418
+ possible_first_prev = group_traits::get_next(possible_first);
419
+ }
420
+ return possible_first;
421
+ }
422
+
423
+ static void erase_from_group(const slist_node_ptr &end_ptr, const node_ptr &to_erase_ptr, detail::true_)
424
+ {
425
+ node_ptr nxt_ptr(node_traits::get_next(to_erase_ptr));
426
+ node_ptr prev_in_group_ptr(group_traits::get_next(to_erase_ptr));
427
+ bool last_in_group = (end_ptr == nxt_ptr) ||
428
+ (group_traits::get_next(nxt_ptr) != to_erase_ptr);
429
+ bool is_first_in_group = node_traits::get_next(prev_in_group_ptr) != to_erase_ptr;
430
+
431
+ if(is_first_in_group && last_in_group){
432
+ group_algorithms::init(to_erase_ptr);
433
+ }
434
+ else if(is_first_in_group){
435
+ group_algorithms::unlink_after(nxt_ptr);
436
+ }
437
+ else if(last_in_group){
438
+ node_ptr first_in_group =
439
+ get_first_in_group_of_last_in_group(to_erase_ptr);
440
+ group_algorithms::unlink_after(first_in_group);
441
+ }
442
+ else{
443
+ group_algorithms::unlink_after(nxt_ptr);
444
+ }
445
+ }
446
+
447
+ static void erase_from_group(const slist_node_ptr&, const node_ptr&, detail::false_)
448
+ {}
449
+
450
+ static node_ptr get_last_in_group(const node_ptr &first_in_group, detail::true_)
451
+ { return group_traits::get_next(first_in_group); }
452
+
453
+ static node_ptr get_last_in_group(const node_ptr &n, detail::false_)
454
+ { return n; }
455
+
456
+ static void init_group(const node_ptr &n, true_)
457
+ { group_algorithms::init(n); }
458
+
459
+ static void init_group(const node_ptr &, false_)
460
+ {}
461
+
462
+ static void insert_in_group(const node_ptr &first_in_group, const node_ptr &n, true_)
463
+ {
464
+ if(first_in_group){
465
+ if(group_algorithms::unique(first_in_group))
466
+ group_algorithms::link_after(first_in_group, n);
467
+ else{
468
+ group_algorithms::link_after(group_algorithms::node_traits::get_next(first_in_group), n);
469
+ }
470
+ }
471
+ else{
472
+ group_algorithms::init_header(n);
473
+ }
474
+ }
475
+
476
+ static slist_node_ptr get_previous_and_next_in_group
477
+ ( const slist_node_ptr &i, node_ptr &nxt_in_group
478
+ //If first_end_ptr == last_end_ptr, then first_end_ptr is the bucket of i
479
+ //Otherwise first_end_ptr is the first bucket and last_end_ptr the last one.
480
+ , const slist_node_ptr &first_end_ptr, const slist_node_ptr &last_end_ptr)
481
+ {
482
+ slist_node_ptr prev;
483
+ node_ptr elem(group_functions::dcast_bucket_ptr(i));
484
+
485
+ //It's the last in group if the next_node is a bucket
486
+ slist_node_ptr nxt(node_traits::get_next(elem));
487
+ bool last_in_group = (first_end_ptr <= nxt && nxt <= last_end_ptr)/* ||
488
+ (group_traits::get_next(nxt) != elem)*/;
489
+ //It's the first in group if group_previous's next_node is not
490
+ //itself, as group list does not link bucket
491
+ node_ptr prev_in_group(group_traits::get_next(elem));
492
+ bool first_in_group = node_traits::get_next(prev_in_group) != elem;
493
+
494
+ if(first_in_group){
495
+ node_ptr start_pos;
496
+ if(last_in_group){
497
+ start_pos = elem;
498
+ nxt_in_group = node_ptr();
499
+ }
500
+ else{
501
+ start_pos = prev_in_group;
502
+ nxt_in_group = node_traits::get_next(elem);
503
+ }
504
+ slist_node_ptr bucket_node;
505
+ if(first_end_ptr != last_end_ptr){
506
+ bucket_node = group_functions::get_bucket_before_begin
507
+ (first_end_ptr, last_end_ptr, start_pos);
508
+ }
509
+ else{
510
+ bucket_node = first_end_ptr;
511
+ }
512
+ prev = group_functions::get_prev_to_first_in_group(bucket_node, elem);
513
+ }
514
+ else{
515
+ if(last_in_group){
516
+ nxt_in_group = group_functions::get_first_in_group_of_last_in_group(elem);
517
+ }
518
+ else{
519
+ nxt_in_group = node_traits::get_next(elem);
520
+ }
521
+ prev = group_traits::get_next(elem);
522
+ }
523
+ return prev;
524
+ }
525
+
526
+ static void insert_in_group(const node_ptr&, const node_ptr&, false_)
527
+ {}
528
+ };
529
+
530
+ template<class BucketType, class SplitTraits>
531
+ class incremental_rehash_rollback
532
+ {
533
+ private:
534
+ typedef BucketType bucket_type;
535
+ typedef SplitTraits split_traits;
536
+
537
+ incremental_rehash_rollback();
538
+ incremental_rehash_rollback & operator=(const incremental_rehash_rollback &);
539
+ incremental_rehash_rollback (const incremental_rehash_rollback &);
540
+
541
+ public:
542
+ incremental_rehash_rollback
543
+ (bucket_type &source_bucket, bucket_type &destiny_bucket, split_traits &split_traits)
544
+ : source_bucket_(source_bucket), destiny_bucket_(destiny_bucket)
545
+ , split_traits_(split_traits), released_(false)
546
+ {}
547
+
548
+ void release()
549
+ { released_ = true; }
550
+
551
+ ~incremental_rehash_rollback()
552
+ {
553
+ if(!released_){
554
+ //If an exception is thrown, just put all moved nodes back in the old bucket
555
+ //and move back the split mark.
556
+ destiny_bucket_.splice_after(destiny_bucket_.before_begin(), source_bucket_);
557
+ split_traits_.decrement();
558
+ }
559
+ }
560
+
561
+ private:
562
+ bucket_type &source_bucket_;
563
+ bucket_type &destiny_bucket_;
564
+ split_traits &split_traits_;
565
+ bool released_;
566
+ };
567
+
568
+ template<class NodeTraits>
569
+ struct node_functions
570
+ {
571
+ static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, true_)
572
+ { return NodeTraits::set_hash(p, h); }
573
+
574
+ static void store_hash(typename NodeTraits::node_ptr, std::size_t, false_)
575
+ {}
576
+ };
577
+
578
+ } //namespace detail {
579
+
580
+ //!This metafunction will obtain the type of a bucket
581
+ //!from the value_traits or hook option to be used with
582
+ //!a hash container.
583
+ template<class ValueTraitsOrHookOption>
584
+ struct unordered_bucket
585
+ : public detail::unordered_bucket_impl
586
+ <typename ValueTraitsOrHookOption::
587
+ template pack<none>::value_traits
588
+ >
589
+ {};
590
+
591
+ //!This metafunction will obtain the type of a bucket pointer
592
+ //!from the value_traits or hook option to be used with
593
+ //!a hash container.
594
+ template<class ValueTraitsOrHookOption>
595
+ struct unordered_bucket_ptr
596
+ : public detail::unordered_bucket_ptr_impl
597
+ <typename ValueTraitsOrHookOption::
598
+ template pack<none>::value_traits
599
+ >
600
+ {};
601
+
602
+ //!This metafunction will obtain the type of the default bucket traits
603
+ //!(when the user does not specify the bucket_traits<> option) from the
604
+ //!value_traits or hook option to be used with
605
+ //!a hash container.
606
+ template<class ValueTraitsOrHookOption>
607
+ struct unordered_default_bucket_traits
608
+ {
609
+ typedef typename ValueTraitsOrHookOption::
610
+ template pack<none>::value_traits supposed_value_traits;
611
+ typedef typename detail::
612
+ get_slist_impl_from_supposed_value_traits
613
+ <supposed_value_traits>::type slist_impl;
614
+ typedef detail::bucket_traits_impl
615
+ <slist_impl> implementation_defined;
616
+ typedef implementation_defined type;
617
+ };
618
+
619
+ struct default_bucket_traits;
620
+
621
+ template <class T>
622
+ struct uset_defaults
623
+ : pack_options
624
+ < none
625
+ , base_hook<detail::default_uset_hook>
626
+ , constant_time_size<true>
627
+ , size_type<std::size_t>
628
+ , equal<std::equal_to<T> >
629
+ , hash<boost::hash<T> >
630
+ , bucket_traits<default_bucket_traits>
631
+ , power_2_buckets<false>
632
+ , cache_begin<false>
633
+ , compare_hash<false>
634
+ , incremental<false>
635
+ >::type
636
+ {};
637
+
638
+ /// @endcond
639
+
640
+ //! The class template hashtable is an intrusive hash table container, that
641
+ //! is used to construct intrusive unordered_set and unordered_multiset containers. The
642
+ //! no-throw guarantee holds only, if the Equal object and Hasher don't throw.
643
+ //!
644
+ //! hashtable is a semi-intrusive container: each object to be stored in the
645
+ //! container must contain a proper hook, but the container also needs
646
+ //! additional auxiliary memory to work: hashtable needs a pointer to an array
647
+ //! of type `bucket_type` to be passed in the constructor. This bucket array must
648
+ //! have at least the same lifetime as the container. This makes the use of
649
+ //! hashtable more complicated than purely intrusive containers.
650
+ //! `bucket_type` is default-constructible, copyable and assignable
651
+ //!
652
+ //! The template parameter \c T is the type to be managed by the container.
653
+ //! The user can specify additional options and if no options are provided
654
+ //! default options are used.
655
+ //!
656
+ //! The container supports the following options:
657
+ //! \c base_hook<>/member_hook<>/value_traits<>,
658
+ //! \c constant_time_size<>, \c size_type<>, \c hash<> and \c equal<>
659
+ //! \c bucket_traits<>, power_2_buckets<>, cache_begin<> and incremental<>.
660
+ //!
661
+ //! hashtable only provides forward iterators but it provides 4 iterator types:
662
+ //! iterator and const_iterator to navigate through the whole container and
663
+ //! local_iterator and const_local_iterator to navigate through the values
664
+ //! stored in a single bucket. Local iterators are faster and smaller.
665
+ //!
666
+ //! It's not recommended to use non constant-time size hashtables because several
667
+ //! key functions, like "empty()", become non-constant time functions. Non
668
+ //! constant_time size hashtables are mainly provided to support auto-unlink hooks.
669
+ //!
670
+ //! hashtables, does not make automatic rehashings nor
671
+ //! offers functions related to a load factor. Rehashing can be explicitly requested
672
+ //! and the user must provide a new bucket array that will be used from that moment.
673
+ //!
674
+ //! Since no automatic rehashing is done, iterators are never invalidated when
675
+ //! inserting or erasing elements. Iterators are only invalidated when rehashing.
676
+ #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
677
+ template<class T, class ...Options>
678
+ #else
679
+ template<class Config>
680
+ #endif
681
+ class hashtable_impl
682
+ : private detail::clear_on_destructor_base<hashtable_impl<Config> >
683
+ {
684
+ template<class C> friend class detail::clear_on_destructor_base;
685
+ public:
686
+ typedef typename Config::value_traits value_traits;
687
+
688
+ /// @cond
689
+ static const bool external_value_traits =
690
+ detail::external_value_traits_bool_is_true<value_traits>::value;
691
+ typedef typename detail::eval_if_c
692
+ < external_value_traits
693
+ , detail::eval_value_traits<value_traits>
694
+ , detail::identity<value_traits>
695
+ >::type real_value_traits;
696
+ typedef typename Config::bucket_traits bucket_traits;
697
+ static const bool external_bucket_traits =
698
+ detail::external_bucket_traits_bool_is_true<bucket_traits>::value;
699
+ typedef typename detail::eval_if_c
700
+ < external_bucket_traits
701
+ , detail::eval_bucket_traits<bucket_traits>
702
+ , detail::identity<bucket_traits>
703
+ >::type real_bucket_traits;
704
+ typedef typename detail::get_slist_impl
705
+ <typename detail::reduced_slist_node_traits
706
+ <typename real_value_traits::node_traits>::type
707
+ >::type slist_impl;
708
+ /// @endcond
709
+
710
+ typedef typename real_value_traits::pointer pointer;
711
+ typedef typename real_value_traits::const_pointer const_pointer;
712
+ typedef typename real_value_traits::value_type value_type;
713
+ typedef typename pointer_traits<pointer>::reference reference;
714
+ typedef typename pointer_traits<const_pointer>::reference const_reference;
715
+ typedef typename pointer_traits<pointer>::difference_type difference_type;
716
+ typedef typename Config::size_type size_type;
717
+ typedef value_type key_type;
718
+ typedef typename Config::equal key_equal;
719
+ typedef typename Config::hash hasher;
720
+ typedef detail::bucket_impl<slist_impl> bucket_type;
721
+ typedef typename pointer_traits
722
+ <pointer>::template rebind_pointer
723
+ < bucket_type >::type bucket_ptr;
724
+ typedef typename slist_impl::iterator siterator;
725
+ typedef typename slist_impl::const_iterator const_siterator;
726
+ typedef detail::hashtable_iterator<hashtable_impl, false> iterator;
727
+ typedef detail::hashtable_iterator<hashtable_impl, true> const_iterator;
728
+ typedef typename real_value_traits::node_traits node_traits;
729
+ typedef typename node_traits::node node;
730
+ typedef typename pointer_traits
731
+ <pointer>::template rebind_pointer
732
+ < node >::type node_ptr;
733
+ typedef typename pointer_traits
734
+ <pointer>::template rebind_pointer
735
+ < const node >::type const_node_ptr;
736
+ typedef typename slist_impl::node_algorithms node_algorithms;
737
+
738
+ static const bool stateful_value_traits = detail::is_stateful_value_traits<real_value_traits>::value;
739
+ static const bool store_hash = detail::store_hash_is_true<node_traits>::value;
740
+
741
+ static const bool unique_keys = 0 != (Config::bool_flags & detail::hash_bool_flags::unique_keys_pos);
742
+ static const bool constant_time_size = 0 != (Config::bool_flags & detail::hash_bool_flags::constant_time_size_pos);
743
+ static const bool cache_begin = 0 != (Config::bool_flags & detail::hash_bool_flags::cache_begin_pos);
744
+ static const bool compare_hash = 0 != (Config::bool_flags & detail::hash_bool_flags::compare_hash_pos);
745
+ static const bool incremental = 0 != (Config::bool_flags & detail::hash_bool_flags::incremental_pos);
746
+ static const bool power_2_buckets = incremental || (0 != (Config::bool_flags & detail::hash_bool_flags::power_2_buckets_pos));
747
+
748
+ static const bool optimize_multikey
749
+ = detail::optimize_multikey_is_true<node_traits>::value && !unique_keys;
750
+
751
+ /// @cond
752
+ private:
753
+
754
+ //Configuration error: compare_hash<> can't be specified without store_hash<>
755
+ //See documentation for more explanations
756
+ BOOST_STATIC_ASSERT((!compare_hash || store_hash));
757
+
758
+ typedef typename slist_impl::node_ptr slist_node_ptr;
759
+ typedef typename pointer_traits
760
+ <slist_node_ptr>::template rebind_pointer
761
+ < void >::type void_pointer;
762
+ //We'll define group traits, but these won't be instantiated if
763
+ //optimize_multikey is not true
764
+ typedef unordered_group_adapter<node_traits> group_traits;
765
+ typedef circular_slist_algorithms<group_traits> group_algorithms;
766
+ typedef detail::bool_<store_hash> store_hash_t;
767
+ typedef detail::bool_<optimize_multikey> optimize_multikey_t;
768
+ typedef detail::bool_<cache_begin> cache_begin_t;
769
+ typedef detail::bool_<power_2_buckets> power_2_buckets_t;
770
+ typedef detail::size_holder<constant_time_size, size_type> size_traits;
771
+ typedef detail::size_holder<incremental, size_type> split_traits;
772
+ typedef detail::group_functions<node_traits> group_functions_t;
773
+ typedef detail::node_functions<node_traits> node_functions_t;
774
+
775
+ static const std::size_t hashtable_data_bool_flags_mask =
776
+ ( detail::hash_bool_flags::cache_begin_pos
777
+ | detail::hash_bool_flags::constant_time_size_pos
778
+ | detail::hash_bool_flags::incremental_pos
779
+ );
780
+ typedef typename detail::usetopt_mask
781
+ <Config, hashtable_data_bool_flags_mask>::type masked_config_t;
782
+ detail::hashtable_data_t<masked_config_t> data_;
783
+
784
+ template<bool IsConst>
785
+ struct downcast_node_to_value
786
+ : public detail::node_to_value<hashtable_impl, IsConst>
787
+ {
788
+ typedef detail::node_to_value<hashtable_impl, IsConst> base_t;
789
+ typedef typename base_t::result_type result_type;
790
+ typedef typename detail::add_const_if_c
791
+ <typename slist_impl::node, IsConst>::type &first_argument_type;
792
+ typedef typename detail::add_const_if_c
793
+ <node, IsConst>::type &intermediate_argument_type;
794
+
795
+ downcast_node_to_value(const hashtable_impl *cont)
796
+ : base_t(cont)
797
+ {}
798
+
799
+ result_type operator()(first_argument_type arg) const
800
+ { return this->base_t::operator()(static_cast<intermediate_argument_type>(arg)); }
801
+ };
802
+
803
+ template<class F>
804
+ struct node_cast_adaptor
805
+ : private detail::ebo_functor_holder<F>
806
+ {
807
+ typedef detail::ebo_functor_holder<F> base_t;
808
+
809
+ template<class ConvertibleToF>
810
+ node_cast_adaptor(const ConvertibleToF &c2f, const hashtable_impl *cont)
811
+ : base_t(base_t(c2f, cont))
812
+ {}
813
+
814
+ typename base_t::node_ptr operator()(const typename slist_impl::node &to_clone)
815
+ { return base_t::operator()(static_cast<const node &>(to_clone)); }
816
+
817
+ void operator()(typename slist_impl::node_ptr to_clone)
818
+ {
819
+ base_t::operator()(pointer_traits<node_ptr>::pointer_to(static_cast<node &>(*to_clone)));
820
+ }
821
+ };
822
+
823
+ private:
824
+ //noncopyable, movable
825
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable_impl)
826
+
827
+ enum { safemode_or_autounlink =
828
+ (int)real_value_traits::link_mode == (int)auto_unlink ||
829
+ (int)real_value_traits::link_mode == (int)safe_link };
830
+
831
+ //Constant-time size is incompatible with auto-unlink hooks!
832
+ BOOST_STATIC_ASSERT(!(constant_time_size && ((int)real_value_traits::link_mode == (int)auto_unlink)));
833
+ //Cache begin is incompatible with auto-unlink hooks!
834
+ BOOST_STATIC_ASSERT(!(cache_begin && ((int)real_value_traits::link_mode == (int)auto_unlink)));
835
+
836
+ template<class Disposer>
837
+ node_cast_adaptor<detail::node_disposer<Disposer, hashtable_impl> >
838
+ make_node_disposer(const Disposer &disposer) const
839
+ { return node_cast_adaptor<detail::node_disposer<Disposer, hashtable_impl> >(disposer, this); }
840
+
841
+ /// @endcond
842
+
843
+ public:
844
+ typedef detail::insert_commit_data_impl insert_commit_data;
845
+
846
+ typedef detail::transform_iterator
847
+ < typename slist_impl::iterator
848
+ , downcast_node_to_value<false> > local_iterator;
849
+
850
+ typedef detail::transform_iterator
851
+ < typename slist_impl::iterator
852
+ , downcast_node_to_value<true> > const_local_iterator;
853
+
854
+ /// @cond
855
+
856
+ const real_value_traits &get_real_value_traits(detail::false_) const
857
+ { return this->data_; }
858
+
859
+ const real_value_traits &get_real_value_traits(detail::true_) const
860
+ { return data_.get_value_traits(*this); }
861
+
862
+ real_value_traits &get_real_value_traits(detail::false_)
863
+ { return this->data_; }
864
+
865
+ real_value_traits &get_real_value_traits(detail::true_)
866
+ { return data_.get_value_traits(*this); }
867
+
868
+ /// @endcond
869
+
870
+ public:
871
+
872
+ const real_value_traits &get_real_value_traits() const
873
+ { return this->get_real_value_traits(detail::bool_<external_value_traits>()); }
874
+
875
+ real_value_traits &get_real_value_traits()
876
+ { return this->get_real_value_traits(detail::bool_<external_value_traits>()); }
877
+
878
+ //! <b>Requires</b>: buckets must not be being used by any other resource.
879
+ //!
880
+ //! <b>Effects</b>: Constructs an empty unordered_set, storing a reference
881
+ //! to the bucket array and copies of the key_hasher and equal_func functors.
882
+ //!
883
+ //! <b>Complexity</b>: Constant.
884
+ //!
885
+ //! <b>Throws</b>: If value_traits::node_traits::node
886
+ //! constructor throws (this does not happen with predefined Boost.Intrusive hooks)
887
+ //! or the copy constructor or invocation of hash_func or equal_func throws.
888
+ //!
889
+ //! <b>Notes</b>: buckets array must be disposed only after
890
+ //! *this is disposed.
891
+ explicit hashtable_impl ( const bucket_traits &b_traits
892
+ , const hasher & hash_func = hasher()
893
+ , const key_equal &equal_func = key_equal()
894
+ , const value_traits &v_traits = value_traits())
895
+ : data_(b_traits, hash_func, equal_func, v_traits)
896
+ {
897
+ this->priv_initialize_buckets();
898
+ this->priv_size_traits().set_size(size_type(0));
899
+ size_type bucket_sz = this->priv_bucket_count();
900
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(bucket_sz != 0);
901
+ //Check power of two bucket array if the option is activated
902
+ BOOST_INTRUSIVE_INVARIANT_ASSERT
903
+ (!power_2_buckets || (0 == (bucket_sz & (bucket_sz-1))));
904
+ this->priv_split_traits().set_size(bucket_sz>>1);
905
+ }
906
+
907
+ //! <b>Effects</b>: to-do
908
+ //!
909
+ hashtable_impl(BOOST_RV_REF(hashtable_impl) x)
910
+ : data_( ::boost::move(x.priv_bucket_traits())
911
+ , ::boost::move(x.priv_hasher())
912
+ , ::boost::move(x.priv_equal())
913
+ , ::boost::move(x.priv_value_traits())
914
+ )
915
+ {
916
+ this->priv_swap_cache(cache_begin_t(), x);
917
+ x.priv_initialize_cache();
918
+ if(constant_time_size){
919
+ this->priv_size_traits().set_size(size_type(0));
920
+ this->priv_size_traits().set_size(x.priv_size_traits().get_size());
921
+ x.priv_size_traits().set_size(size_type(0));
922
+ }
923
+ if(incremental){
924
+ this->priv_split_traits().set_size(x.priv_split_traits().get_size());
925
+ x.priv_split_traits().set_size(size_type(0));
926
+ }
927
+ }
928
+
929
+ //! <b>Effects</b>: to-do
930
+ //!
931
+ hashtable_impl& operator=(BOOST_RV_REF(hashtable_impl) x)
932
+ { this->swap(x); return *this; }
933
+
934
+ //! <b>Effects</b>: Detaches all elements from this. The objects in the unordered_set
935
+ //! are not deleted (i.e. no destructors are called).
936
+ //!
937
+ //! <b>Complexity</b>: Linear to the number of elements in the unordered_set, if
938
+ //! it's a safe-mode or auto-unlink value. Otherwise constant.
939
+ //!
940
+ //! <b>Throws</b>: Nothing.
941
+ ~hashtable_impl()
942
+ {}
943
+
944
+ //! <b>Effects</b>: Returns an iterator pointing to the beginning of the unordered_set.
945
+ //!
946
+ //! <b>Complexity</b>: Amortized constant time.
947
+ //! Worst case (empty unordered_set): O(this->bucket_count())
948
+ //!
949
+ //! <b>Throws</b>: Nothing.
950
+ iterator begin()
951
+ { return iterator(this->priv_begin(), this); }
952
+
953
+ //! <b>Effects</b>: Returns a const_iterator pointing to the beginning
954
+ //! of the unordered_set.
955
+ //!
956
+ //! <b>Complexity</b>: Amortized constant time.
957
+ //! Worst case (empty unordered_set): O(this->bucket_count())
958
+ //!
959
+ //! <b>Throws</b>: Nothing.
960
+ const_iterator begin() const
961
+ { return this->cbegin(); }
962
+
963
+ //! <b>Effects</b>: Returns a const_iterator pointing to the beginning
964
+ //! of the unordered_set.
965
+ //!
966
+ //! <b>Complexity</b>: Amortized constant time.
967
+ //! Worst case (empty unordered_set): O(this->bucket_count())
968
+ //!
969
+ //! <b>Throws</b>: Nothing.
970
+ const_iterator cbegin() const
971
+ { return const_iterator(this->priv_begin(), this); }
972
+
973
+ //! <b>Effects</b>: Returns an iterator pointing to the end of the unordered_set.
974
+ //!
975
+ //! <b>Complexity</b>: Constant.
976
+ //!
977
+ //! <b>Throws</b>: Nothing.
978
+ iterator end()
979
+ { return iterator(this->priv_invalid_local_it(), 0); }
980
+
981
+ //! <b>Effects</b>: Returns a const_iterator pointing to the end of the unordered_set.
982
+ //!
983
+ //! <b>Complexity</b>: Constant.
984
+ //!
985
+ //! <b>Throws</b>: Nothing.
986
+ const_iterator end() const
987
+ { return this->cend(); }
988
+
989
+ //! <b>Effects</b>: Returns a const_iterator pointing to the end of the unordered_set.
990
+ //!
991
+ //! <b>Complexity</b>: Constant.
992
+ //!
993
+ //! <b>Throws</b>: Nothing.
994
+ const_iterator cend() const
995
+ { return const_iterator(this->priv_invalid_local_it(), 0); }
996
+
997
+ //! <b>Effects</b>: Returns the hasher object used by the unordered_set.
998
+ //!
999
+ //! <b>Complexity</b>: Constant.
1000
+ //!
1001
+ //! <b>Throws</b>: If hasher copy-constructor throws.
1002
+ hasher hash_function() const
1003
+ { return this->priv_hasher(); }
1004
+
1005
+ //! <b>Effects</b>: Returns the key_equal object used by the unordered_set.
1006
+ //!
1007
+ //! <b>Complexity</b>: Constant.
1008
+ //!
1009
+ //! <b>Throws</b>: If key_equal copy-constructor throws.
1010
+ key_equal key_eq() const
1011
+ { return this->priv_equal(); }
1012
+
1013
+ //! <b>Effects</b>: Returns true if the container is empty.
1014
+ //!
1015
+ //! <b>Complexity</b>: if constant-time size and cache_begin options are disabled,
1016
+ //! average constant time (worst case, with empty() == true: O(this->bucket_count()).
1017
+ //! Otherwise constant.
1018
+ //!
1019
+ //! <b>Throws</b>: Nothing.
1020
+ bool empty() const
1021
+ {
1022
+ if(constant_time_size){
1023
+ return !this->size();
1024
+ }
1025
+ else if(cache_begin){
1026
+ return this->begin() == this->end();
1027
+ }
1028
+ else{
1029
+ size_type bucket_cnt = this->priv_bucket_count();
1030
+ const bucket_type *b = boost::intrusive::detail::to_raw_pointer(this->priv_bucket_pointer());
1031
+ for (size_type n = 0; n < bucket_cnt; ++n, ++b){
1032
+ if(!b->empty()){
1033
+ return false;
1034
+ }
1035
+ }
1036
+ return true;
1037
+ }
1038
+ }
1039
+
1040
+ //! <b>Effects</b>: Returns the number of elements stored in the unordered_set.
1041
+ //!
1042
+ //! <b>Complexity</b>: Linear to elements contained in *this if
1043
+ //! constant_time_size is false. Constant-time otherwise.
1044
+ //!
1045
+ //! <b>Throws</b>: Nothing.
1046
+ size_type size() const
1047
+ {
1048
+ if(constant_time_size)
1049
+ return this->priv_size_traits().get_size();
1050
+ else{
1051
+ size_type len = 0;
1052
+ size_type bucket_cnt = this->priv_bucket_count();
1053
+ const bucket_type *b = boost::intrusive::detail::to_raw_pointer(this->priv_bucket_pointer());
1054
+ for (size_type n = 0; n < bucket_cnt; ++n, ++b){
1055
+ len += b->size();
1056
+ }
1057
+ return len;
1058
+ }
1059
+ }
1060
+
1061
+ //! <b>Requires</b>: the hasher and the equality function unqualified swap
1062
+ //! call should not throw.
1063
+ //!
1064
+ //! <b>Effects</b>: Swaps the contents of two unordered_sets.
1065
+ //! Swaps also the contained bucket array and equality and hasher functors.
1066
+ //!
1067
+ //! <b>Complexity</b>: Constant.
1068
+ //!
1069
+ //! <b>Throws</b>: If the swap() call for the comparison or hash functors
1070
+ //! found using ADL throw. Basic guarantee.
1071
+ void swap(hashtable_impl& other)
1072
+ {
1073
+ using std::swap;
1074
+ //These can throw
1075
+ swap(this->priv_equal(), other.priv_equal());
1076
+ swap(this->priv_hasher(), other.priv_hasher());
1077
+ //These can't throw
1078
+ swap(this->priv_bucket_traits(), other.priv_bucket_traits());
1079
+ swap(this->priv_value_traits(), other.priv_value_traits());
1080
+ this->priv_swap_cache(cache_begin_t(), other);
1081
+ if(constant_time_size){
1082
+ size_type backup = this->priv_size_traits().get_size();
1083
+ this->priv_size_traits().set_size(other.priv_size_traits().get_size());
1084
+ other.priv_size_traits().set_size(backup);
1085
+ }
1086
+ if(incremental){
1087
+ size_type backup = this->priv_split_traits().get_size();
1088
+ this->priv_split_traits().set_size(other.priv_split_traits().get_size());
1089
+ other.priv_split_traits().set_size(backup);
1090
+ }
1091
+ }
1092
+
1093
+ //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw
1094
+ //! Cloner should yield to nodes that compare equal and produce the same
1095
+ //! hash than the original node.
1096
+ //!
1097
+ //! <b>Effects</b>: Erases all the elements from *this
1098
+ //! calling Disposer::operator()(pointer), clones all the
1099
+ //! elements from src calling Cloner::operator()(const_reference )
1100
+ //! and inserts them on *this. The hash function and the equality
1101
+ //! predicate are copied from the source.
1102
+ //!
1103
+ //! If store_hash option is true, this method does not use the hash function.
1104
+ //!
1105
+ //! If any operation throws, all cloned elements are unlinked and disposed
1106
+ //! calling Disposer::operator()(pointer).
1107
+ //!
1108
+ //! <b>Complexity</b>: Linear to erased plus inserted elements.
1109
+ //!
1110
+ //! <b>Throws</b>: If cloner or hasher throw or hash or equality predicate copying
1111
+ //! throws. Basic guarantee.
1112
+ template <class Cloner, class Disposer>
1113
+ void clone_from(const hashtable_impl &src, Cloner cloner, Disposer disposer)
1114
+ {
1115
+ this->clear_and_dispose(disposer);
1116
+ if(!constant_time_size || !src.empty()){
1117
+ const size_type src_bucket_count = src.bucket_count();
1118
+ const size_type dst_bucket_count = this->bucket_count();
1119
+ //Check power of two bucket array if the option is activated
1120
+ BOOST_INTRUSIVE_INVARIANT_ASSERT
1121
+ (!power_2_buckets || (0 == (src_bucket_count & (src_bucket_count-1))));
1122
+ BOOST_INTRUSIVE_INVARIANT_ASSERT
1123
+ (!power_2_buckets || (0 == (dst_bucket_count & (dst_bucket_count-1))));
1124
+
1125
+ //If src bucket count is bigger or equal, structural copy is possible
1126
+ if(!incremental && (src_bucket_count >= dst_bucket_count)){
1127
+ //First clone the first ones
1128
+ const bucket_ptr src_buckets = src.priv_bucket_pointer();
1129
+ const bucket_ptr dst_buckets = this->priv_bucket_pointer();
1130
+ size_type constructed;
1131
+ typedef node_cast_adaptor<detail::node_disposer<Disposer, hashtable_impl> > NodeDisposer;
1132
+ typedef node_cast_adaptor<detail::node_cloner<Cloner, hashtable_impl> > NodeCloner;
1133
+ NodeDisposer node_disp(disposer, this);
1134
+
1135
+ detail::exception_array_disposer<bucket_type, NodeDisposer, size_type>
1136
+ rollback(dst_buckets[0], node_disp, constructed);
1137
+ for( constructed = 0
1138
+ ; constructed < dst_bucket_count
1139
+ ; ++constructed){
1140
+ dst_buckets[constructed].clone_from
1141
+ ( src_buckets[constructed]
1142
+ , NodeCloner(cloner, this), node_disp);
1143
+ }
1144
+ if(src_bucket_count != dst_bucket_count){
1145
+ //Now insert the remaining ones using the modulo trick
1146
+ for(//"constructed" comes from the previous loop
1147
+ ; constructed < src_bucket_count
1148
+ ; ++constructed){
1149
+ bucket_type &dst_b =
1150
+ dst_buckets[this->priv_hash_to_bucket(constructed, dst_bucket_count, dst_bucket_count)];
1151
+ bucket_type &src_b = src_buckets[constructed];
1152
+ for( siterator b(src_b.begin()), e(src_b.end())
1153
+ ; b != e
1154
+ ; ++b){
1155
+ dst_b.push_front(*(NodeCloner(cloner, this)(*b.pointed_node())));
1156
+ }
1157
+ }
1158
+ }
1159
+ this->priv_hasher() = src.priv_hasher();
1160
+ this->priv_equal() = src.priv_equal();
1161
+ rollback.release();
1162
+ this->priv_size_traits().set_size(src.priv_size_traits().get_size());
1163
+ this->priv_split_traits().set_size(dst_bucket_count);
1164
+ this->priv_insertion_update_cache(0u);
1165
+ this->priv_erasure_update_cache();
1166
+ }
1167
+ else if(store_hash){
1168
+ //Unlike previous cloning algorithm, this can throw
1169
+ //if cloner, hasher or comparison functor throw
1170
+ const_iterator b(src.begin()), e(src.end());
1171
+ detail::exception_disposer<hashtable_impl, Disposer>
1172
+ rollback(*this, disposer);
1173
+ for(; b != e; ++b){
1174
+ std::size_t hash_value = this->priv_stored_or_compute_hash(*b, store_hash_t());;
1175
+ this->priv_insert_equal_with_hash(*cloner(*b), hash_value);
1176
+ }
1177
+ rollback.release();
1178
+ }
1179
+ else{
1180
+ //Unlike previous cloning algorithm, this can throw
1181
+ //if cloner, hasher or comparison functor throw
1182
+ const_iterator b(src.begin()), e(src.end());
1183
+ detail::exception_disposer<hashtable_impl, Disposer>
1184
+ rollback(*this, disposer);
1185
+ for(; b != e; ++b){
1186
+ this->insert_equal(*cloner(*b));
1187
+ }
1188
+ rollback.release();
1189
+ }
1190
+ }
1191
+ }
1192
+
1193
+ //! <b>Requires</b>: value must be an lvalue
1194
+ //!
1195
+ //! <b>Effects</b>: Inserts the value into the unordered_set.
1196
+ //!
1197
+ //! <b>Returns</b>: An iterator to the inserted value.
1198
+ //!
1199
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1200
+ //!
1201
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws. Strong guarantee.
1202
+ //!
1203
+ //! <b>Note</b>: Does not affect the validity of iterators and references.
1204
+ //! No copy-constructors are called.
1205
+ iterator insert_equal(reference value)
1206
+ {
1207
+ size_type bucket_num;
1208
+ std::size_t hash_value;
1209
+ siterator prev;
1210
+ siterator it = this->priv_find
1211
+ (value, this->priv_hasher(), this->priv_equal(), bucket_num, hash_value, prev);
1212
+ return this->priv_insert_equal_find(value, bucket_num, hash_value, it);
1213
+ }
1214
+
1215
+ //! <b>Requires</b>: Dereferencing iterator must yield an lvalue
1216
+ //! of type value_type.
1217
+ //!
1218
+ //! <b>Effects</b>: Equivalent to this->insert_equal(t) for each element in [b, e).
1219
+ //!
1220
+ //! <b>Complexity</b>: Average case O(N), where N is std::distance(b, e).
1221
+ //! Worst case O(N*this->size()).
1222
+ //!
1223
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws. Basic guarantee.
1224
+ //!
1225
+ //! <b>Note</b>: Does not affect the validity of iterators and references.
1226
+ //! No copy-constructors are called.
1227
+ template<class Iterator>
1228
+ void insert_equal(Iterator b, Iterator e)
1229
+ {
1230
+ for (; b != e; ++b)
1231
+ this->insert_equal(*b);
1232
+ }
1233
+
1234
+ //! <b>Requires</b>: value must be an lvalue
1235
+ //!
1236
+ //! <b>Effects</b>: Tries to inserts value into the unordered_set.
1237
+ //!
1238
+ //! <b>Returns</b>: If the value
1239
+ //! is not already present inserts it and returns a pair containing the
1240
+ //! iterator to the new value and true. If there is an equivalent value
1241
+ //! returns a pair containing an iterator to the already present value
1242
+ //! and false.
1243
+ //!
1244
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1245
+ //!
1246
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws. Strong guarantee.
1247
+ //!
1248
+ //! <b>Note</b>: Does not affect the validity of iterators and references.
1249
+ //! No copy-constructors are called.
1250
+ std::pair<iterator, bool> insert_unique(reference value)
1251
+ {
1252
+ insert_commit_data commit_data;
1253
+ std::pair<iterator, bool> ret = this->insert_unique_check
1254
+ (value, this->priv_hasher(), this->priv_equal(), commit_data);
1255
+ if(!ret.second)
1256
+ return ret;
1257
+ return std::pair<iterator, bool>
1258
+ (this->insert_unique_commit(value, commit_data), true);
1259
+ }
1260
+
1261
+ //! <b>Requires</b>: Dereferencing iterator must yield an lvalue
1262
+ //! of type value_type.
1263
+ //!
1264
+ //! <b>Effects</b>: Equivalent to this->insert_unique(t) for each element in [b, e).
1265
+ //!
1266
+ //! <b>Complexity</b>: Average case O(N), where N is std::distance(b, e).
1267
+ //! Worst case O(N*this->size()).
1268
+ //!
1269
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws. Basic guarantee.
1270
+ //!
1271
+ //! <b>Note</b>: Does not affect the validity of iterators and references.
1272
+ //! No copy-constructors are called.
1273
+ template<class Iterator>
1274
+ void insert_unique(Iterator b, Iterator e)
1275
+ {
1276
+ for (; b != e; ++b)
1277
+ this->insert_unique(*b);
1278
+ }
1279
+
1280
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1281
+ //! the same hash values as the stored hasher. The difference is that
1282
+ //! "hash_func" hashes the given key instead of the value_type.
1283
+ //!
1284
+ //! "equal_func" must be a equality function that induces
1285
+ //! the same equality as key_equal. The difference is that
1286
+ //! "equal_func" compares an arbitrary key with the contained values.
1287
+ //!
1288
+ //! <b>Effects</b>: Checks if a value can be inserted in the unordered_set, using
1289
+ //! a user provided key instead of the value itself.
1290
+ //!
1291
+ //! <b>Returns</b>: If there is an equivalent value
1292
+ //! returns a pair containing an iterator to the already present value
1293
+ //! and false. If the value can be inserted returns true in the returned
1294
+ //! pair boolean and fills "commit_data" that is meant to be used with
1295
+ //! the "insert_commit" function.
1296
+ //!
1297
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1298
+ //!
1299
+ //! <b>Throws</b>: If hash_func or equal_func throw. Strong guarantee.
1300
+ //!
1301
+ //! <b>Notes</b>: This function is used to improve performance when constructing
1302
+ //! a value_type is expensive: if there is an equivalent value
1303
+ //! the constructed object must be discarded. Many times, the part of the
1304
+ //! node that is used to impose the hash or the equality is much cheaper to
1305
+ //! construct than the value_type and this function offers the possibility to
1306
+ //! use that the part to check if the insertion will be successful.
1307
+ //!
1308
+ //! If the check is successful, the user can construct the value_type and use
1309
+ //! "insert_commit" to insert the object in constant-time.
1310
+ //!
1311
+ //! "commit_data" remains valid for a subsequent "insert_commit" only if no more
1312
+ //! objects are inserted or erased from the unordered_set.
1313
+ //!
1314
+ //! After a successful rehashing insert_commit_data remains valid.
1315
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1316
+ std::pair<iterator, bool> insert_unique_check
1317
+ ( const KeyType &key
1318
+ , KeyHasher hash_func
1319
+ , KeyValueEqual equal_func
1320
+ , insert_commit_data &commit_data)
1321
+ {
1322
+ size_type bucket_num;
1323
+ siterator prev;
1324
+ siterator prev_pos =
1325
+ this->priv_find(key, hash_func, equal_func, bucket_num, commit_data.hash, prev);
1326
+ bool success = prev_pos == this->priv_invalid_local_it();
1327
+ if(success){
1328
+ prev_pos = prev;
1329
+ }
1330
+ return std::pair<iterator, bool>(iterator(prev_pos, this),success);
1331
+ }
1332
+
1333
+ //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
1334
+ //! must have been obtained from a previous call to "insert_check".
1335
+ //! No objects should have been inserted or erased from the unordered_set between
1336
+ //! the "insert_check" that filled "commit_data" and the call to "insert_commit".
1337
+ //!
1338
+ //! <b>Effects</b>: Inserts the value in the unordered_set using the information obtained
1339
+ //! from the "commit_data" that a previous "insert_check" filled.
1340
+ //!
1341
+ //! <b>Returns</b>: An iterator to the newly inserted object.
1342
+ //!
1343
+ //! <b>Complexity</b>: Constant time.
1344
+ //!
1345
+ //! <b>Throws</b>: Nothing.
1346
+ //!
1347
+ //! <b>Notes</b>: This function has only sense if a "insert_check" has been
1348
+ //! previously executed to fill "commit_data". No value should be inserted or
1349
+ //! erased between the "insert_check" and "insert_commit" calls.
1350
+ //!
1351
+ //! After a successful rehashing insert_commit_data remains valid.
1352
+ iterator insert_unique_commit(reference value, const insert_commit_data &commit_data)
1353
+ {
1354
+ size_type bucket_num = this->priv_hash_to_bucket(commit_data.hash);
1355
+ bucket_type &b = this->priv_bucket_pointer()[bucket_num];
1356
+ this->priv_size_traits().increment();
1357
+ node_ptr n = pointer_traits<node_ptr>::pointer_to(this->priv_value_to_node(value));
1358
+ node_functions_t::store_hash(n, commit_data.hash, store_hash_t());
1359
+ if(safemode_or_autounlink)
1360
+ BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
1361
+ this->priv_insertion_update_cache(bucket_num);
1362
+ group_functions_t::insert_in_group(node_ptr(), n, optimize_multikey_t());
1363
+ return iterator(b.insert_after(b.before_begin(), *n), this);
1364
+ }
1365
+
1366
+ //! <b>Effects</b>: Erases the element pointed to by i.
1367
+ //!
1368
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1369
+ //!
1370
+ //! <b>Throws</b>: Nothing.
1371
+ //!
1372
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1373
+ //! to the erased element. No destructors are called.
1374
+ void erase(const_iterator i)
1375
+ { this->erase_and_dispose(i, detail::null_disposer()); }
1376
+
1377
+ //! <b>Effects</b>: Erases the range pointed to by b end e.
1378
+ //!
1379
+ //! <b>Complexity</b>: Average case O(std::distance(b, e)),
1380
+ //! worst case O(this->size()).
1381
+ //!
1382
+ //! <b>Throws</b>: Nothing.
1383
+ //!
1384
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1385
+ //! to the erased elements. No destructors are called.
1386
+ void erase(const_iterator b, const_iterator e)
1387
+ { this->erase_and_dispose(b, e, detail::null_disposer()); }
1388
+
1389
+ //! <b>Effects</b>: Erases all the elements with the given value.
1390
+ //!
1391
+ //! <b>Returns</b>: The number of erased elements.
1392
+ //!
1393
+ //! <b>Complexity</b>: Average case O(this->count(value)).
1394
+ //! Worst case O(this->size()).
1395
+ //!
1396
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1397
+ //! Basic guarantee.
1398
+ //!
1399
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1400
+ //! to the erased elements. No destructors are called.
1401
+ size_type erase(const_reference value)
1402
+ { return this->erase(value, this->priv_hasher(), this->priv_equal()); }
1403
+
1404
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1405
+ //! the same hash values as the stored hasher. The difference is that
1406
+ //! "hash_func" hashes the given key instead of the value_type.
1407
+ //!
1408
+ //! "equal_func" must be a equality function that induces
1409
+ //! the same equality as key_equal. The difference is that
1410
+ //! "equal_func" compares an arbitrary key with the contained values.
1411
+ //!
1412
+ //! <b>Effects</b>: Erases all the elements that have the same hash and
1413
+ //! compare equal with the given key.
1414
+ //!
1415
+ //! <b>Returns</b>: The number of erased elements.
1416
+ //!
1417
+ //! <b>Complexity</b>: Average case O(this->count(value)).
1418
+ //! Worst case O(this->size()).
1419
+ //!
1420
+ //! <b>Throws</b>: If hash_func or equal_func throw. Basic guarantee.
1421
+ //!
1422
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1423
+ //! to the erased elements. No destructors are called.
1424
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1425
+ size_type erase(const KeyType& key, KeyHasher hash_func, KeyValueEqual equal_func)
1426
+ { return this->erase_and_dispose(key, hash_func, equal_func, detail::null_disposer()); }
1427
+
1428
+ //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
1429
+ //!
1430
+ //! <b>Effects</b>: Erases the element pointed to by i.
1431
+ //! Disposer::operator()(pointer) is called for the removed element.
1432
+ //!
1433
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1434
+ //!
1435
+ //! <b>Throws</b>: Nothing.
1436
+ //!
1437
+ //! <b>Note</b>: Invalidates the iterators
1438
+ //! to the erased elements.
1439
+ template<class Disposer>
1440
+ void erase_and_dispose(const_iterator i, Disposer disposer
1441
+ /// @cond
1442
+ , typename detail::enable_if_c<!detail::is_convertible<Disposer, const_iterator>::value >::type * = 0
1443
+ /// @endcond
1444
+ )
1445
+ {
1446
+ this->priv_erase(i, disposer, optimize_multikey_t());
1447
+ this->priv_size_traits().decrement();
1448
+ this->priv_erasure_update_cache();
1449
+ }
1450
+
1451
+ //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
1452
+ //!
1453
+ //! <b>Effects</b>: Erases the range pointed to by b end e.
1454
+ //! Disposer::operator()(pointer) is called for the removed elements.
1455
+ //!
1456
+ //! <b>Complexity</b>: Average case O(std::distance(b, e)),
1457
+ //! worst case O(this->size()).
1458
+ //!
1459
+ //! <b>Throws</b>: Nothing.
1460
+ //!
1461
+ //! <b>Note</b>: Invalidates the iterators
1462
+ //! to the erased elements.
1463
+ template<class Disposer>
1464
+ void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer)
1465
+ {
1466
+ if(b != e){
1467
+ //Get the bucket number and local iterator for both iterators
1468
+ siterator first_local_it(b.slist_it());
1469
+ size_type first_bucket_num = this->priv_get_bucket_num(first_local_it);
1470
+
1471
+ const bucket_ptr buck_ptr = this->priv_bucket_pointer();
1472
+ siterator before_first_local_it
1473
+ = this->priv_get_previous(buck_ptr[first_bucket_num], first_local_it);
1474
+ size_type last_bucket_num;
1475
+ siterator last_local_it;
1476
+
1477
+ //For the end iterator, we will assign the end iterator
1478
+ //of the last bucket
1479
+ if(e == this->end()){
1480
+ last_bucket_num = this->bucket_count() - 1;
1481
+ last_local_it = buck_ptr[last_bucket_num].end();
1482
+ }
1483
+ else{
1484
+ last_local_it = e.slist_it();
1485
+ last_bucket_num = this->priv_get_bucket_num(last_local_it);
1486
+ }
1487
+ this->priv_erase_range(before_first_local_it, first_bucket_num, last_local_it, last_bucket_num, disposer);
1488
+ this->priv_erasure_update_cache(first_bucket_num, last_bucket_num);
1489
+ }
1490
+ }
1491
+
1492
+ //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
1493
+ //!
1494
+ //! <b>Effects</b>: Erases all the elements with the given value.
1495
+ //! Disposer::operator()(pointer) is called for the removed elements.
1496
+ //!
1497
+ //! <b>Returns</b>: The number of erased elements.
1498
+ //!
1499
+ //! <b>Complexity</b>: Average case O(this->count(value)).
1500
+ //! Worst case O(this->size()).
1501
+ //!
1502
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1503
+ //! Basic guarantee.
1504
+ //!
1505
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1506
+ //! to the erased elements. No destructors are called.
1507
+ template<class Disposer>
1508
+ size_type erase_and_dispose(const_reference value, Disposer disposer)
1509
+ { return this->erase_and_dispose(value, this->priv_hasher(), this->priv_equal(), disposer); }
1510
+
1511
+ //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
1512
+ //!
1513
+ //! <b>Effects</b>: Erases all the elements with the given key.
1514
+ //! according to the comparison functor "equal_func".
1515
+ //! Disposer::operator()(pointer) is called for the removed elements.
1516
+ //!
1517
+ //! <b>Returns</b>: The number of erased elements.
1518
+ //!
1519
+ //! <b>Complexity</b>: Average case O(this->count(value)).
1520
+ //! Worst case O(this->size()).
1521
+ //!
1522
+ //! <b>Throws</b>: If hash_func or equal_func throw. Basic guarantee.
1523
+ //!
1524
+ //! <b>Note</b>: Invalidates the iterators
1525
+ //! to the erased elements.
1526
+ template<class KeyType, class KeyHasher, class KeyValueEqual, class Disposer>
1527
+ size_type erase_and_dispose(const KeyType& key, KeyHasher hash_func
1528
+ ,KeyValueEqual equal_func, Disposer disposer)
1529
+ {
1530
+ size_type bucket_num;
1531
+ std::size_t h;
1532
+ siterator prev;
1533
+ siterator it =
1534
+ this->priv_find(key, hash_func, equal_func, bucket_num, h, prev);
1535
+ bool success = it != this->priv_invalid_local_it();
1536
+ size_type cnt(0);
1537
+ if(!success){
1538
+ return 0;
1539
+ }
1540
+ else if(optimize_multikey){
1541
+ siterator last = bucket_type::s_iterator_to
1542
+ (*node_traits::get_next(group_functions_t::get_last_in_group
1543
+ (hashtable_impl::dcast_bucket_ptr(it.pointed_node()), optimize_multikey_t())));
1544
+ this->priv_erase_range_impl(bucket_num, prev, last, disposer, cnt);
1545
+ }
1546
+ else{
1547
+ //If found erase all equal values
1548
+ bucket_type &b = this->priv_bucket_pointer()[bucket_num];
1549
+ for(siterator end_sit = b.end(); it != end_sit; ++cnt, ++it){
1550
+ slist_node_ptr n(it.pointed_node());
1551
+ const value_type &v = this->priv_value_from_slist_node(n);
1552
+ if(compare_hash){
1553
+ std::size_t vh = this->priv_stored_or_compute_hash(v, store_hash_t());
1554
+ if(h != vh || !equal_func(key, v)){
1555
+ break;
1556
+ }
1557
+ }
1558
+ else if(!equal_func(key, v)){
1559
+ break;
1560
+ }
1561
+ this->priv_size_traits().decrement();
1562
+ }
1563
+ b.erase_after_and_dispose(prev, it, make_node_disposer(disposer));
1564
+ }
1565
+ this->priv_erasure_update_cache();
1566
+ return cnt;
1567
+ }
1568
+
1569
+ //! <b>Effects</b>: Erases all of the elements.
1570
+ //!
1571
+ //! <b>Complexity</b>: Linear to the number of elements on the container.
1572
+ //! if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
1573
+ //!
1574
+ //! <b>Throws</b>: Nothing.
1575
+ //!
1576
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1577
+ //! to the erased elements. No destructors are called.
1578
+ void clear()
1579
+ {
1580
+ this->priv_clear_buckets();
1581
+ this->priv_size_traits().set_size(size_type(0));
1582
+ }
1583
+
1584
+ //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
1585
+ //!
1586
+ //! <b>Effects</b>: Erases all of the elements.
1587
+ //!
1588
+ //! <b>Complexity</b>: Linear to the number of elements on the container.
1589
+ //! Disposer::operator()(pointer) is called for the removed elements.
1590
+ //!
1591
+ //! <b>Throws</b>: Nothing.
1592
+ //!
1593
+ //! <b>Note</b>: Invalidates the iterators (but not the references)
1594
+ //! to the erased elements. No destructors are called.
1595
+ template<class Disposer>
1596
+ void clear_and_dispose(Disposer disposer)
1597
+ {
1598
+ if(!constant_time_size || !this->empty()){
1599
+ size_type num_buckets = this->bucket_count();
1600
+ bucket_ptr b = this->priv_bucket_pointer();
1601
+ for(; num_buckets--; ++b){
1602
+ b->clear_and_dispose(make_node_disposer(disposer));
1603
+ }
1604
+ this->priv_size_traits().set_size(size_type(0));
1605
+ }
1606
+ this->priv_initialize_cache();
1607
+ }
1608
+
1609
+ //! <b>Effects</b>: Returns the number of contained elements with the given value
1610
+ //!
1611
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1612
+ //!
1613
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1614
+ size_type count(const_reference value) const
1615
+ { return this->count(value, this->priv_hasher(), this->priv_equal()); }
1616
+
1617
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1618
+ //! the same hash values as the stored hasher. The difference is that
1619
+ //! "hash_func" hashes the given key instead of the value_type.
1620
+ //!
1621
+ //! "equal_func" must be a equality function that induces
1622
+ //! the same equality as key_equal. The difference is that
1623
+ //! "equal_func" compares an arbitrary key with the contained values.
1624
+ //!
1625
+ //! <b>Effects</b>: Returns the number of contained elements with the given key
1626
+ //!
1627
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1628
+ //!
1629
+ //! <b>Throws</b>: If hash_func or equal throw.
1630
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1631
+ size_type count(const KeyType &key, const KeyHasher &hash_func, const KeyValueEqual &equal_func) const
1632
+ {
1633
+ size_type bucket_n1, bucket_n2, cnt;
1634
+ this->priv_equal_range(key, hash_func, equal_func, bucket_n1, bucket_n2, cnt);
1635
+ return cnt;
1636
+ }
1637
+
1638
+ //! <b>Effects</b>: Finds an iterator to the first element is equal to
1639
+ //! "value" or end() if that element does not exist.
1640
+ //!
1641
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1642
+ //!
1643
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1644
+ iterator find(const_reference value)
1645
+ { return this->find(value, this->priv_hasher(), this->priv_equal()); }
1646
+
1647
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1648
+ //! the same hash values as the stored hasher. The difference is that
1649
+ //! "hash_func" hashes the given key instead of the value_type.
1650
+ //!
1651
+ //! "equal_func" must be a equality function that induces
1652
+ //! the same equality as key_equal. The difference is that
1653
+ //! "equal_func" compares an arbitrary key with the contained values.
1654
+ //!
1655
+ //! <b>Effects</b>: Finds an iterator to the first element whose key is
1656
+ //! "key" according to the given hash and equality functor or end() if
1657
+ //! that element does not exist.
1658
+ //!
1659
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1660
+ //!
1661
+ //! <b>Throws</b>: If hash_func or equal_func throw.
1662
+ //!
1663
+ //! <b>Note</b>: This function is used when constructing a value_type
1664
+ //! is expensive and the value_type can be compared with a cheaper
1665
+ //! key type. Usually this key is part of the value_type.
1666
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1667
+ iterator find(const KeyType &key, KeyHasher hash_func, KeyValueEqual equal_func)
1668
+ {
1669
+ size_type bucket_n;
1670
+ std::size_t hash;
1671
+ siterator prev;
1672
+ siterator local_it = this->priv_find(key, hash_func, equal_func, bucket_n, hash, prev);
1673
+ return iterator(local_it, this);
1674
+ }
1675
+
1676
+ //! <b>Effects</b>: Finds a const_iterator to the first element whose key is
1677
+ //! "key" or end() if that element does not exist.
1678
+ //!
1679
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1680
+ //!
1681
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1682
+ const_iterator find(const_reference value) const
1683
+ { return this->find(value, this->priv_hasher(), this->priv_equal()); }
1684
+
1685
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1686
+ //! the same hash values as the stored hasher. The difference is that
1687
+ //! "hash_func" hashes the given key instead of the value_type.
1688
+ //!
1689
+ //! "equal_func" must be a equality function that induces
1690
+ //! the same equality as key_equal. The difference is that
1691
+ //! "equal_func" compares an arbitrary key with the contained values.
1692
+ //!
1693
+ //! <b>Effects</b>: Finds an iterator to the first element whose key is
1694
+ //! "key" according to the given hasher and equality functor or end() if
1695
+ //! that element does not exist.
1696
+ //!
1697
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
1698
+ //!
1699
+ //! <b>Throws</b>: If hash_func or equal_func throw.
1700
+ //!
1701
+ //! <b>Note</b>: This function is used when constructing a value_type
1702
+ //! is expensive and the value_type can be compared with a cheaper
1703
+ //! key type. Usually this key is part of the value_type.
1704
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1705
+ const_iterator find
1706
+ (const KeyType &key, KeyHasher hash_func, KeyValueEqual equal_func) const
1707
+ {
1708
+ size_type bucket_n;
1709
+ std::size_t hash_value;
1710
+ siterator prev;
1711
+ siterator sit = this->priv_find(key, hash_func, equal_func, bucket_n, hash_value, prev);
1712
+ return const_iterator(sit, this);
1713
+ }
1714
+
1715
+ //! <b>Effects</b>: Returns a range containing all elements with values equivalent
1716
+ //! to value. Returns std::make_pair(this->end(), this->end()) if no such
1717
+ //! elements exist.
1718
+ //!
1719
+ //! <b>Complexity</b>: Average case O(this->count(value)). Worst case O(this->size()).
1720
+ //!
1721
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1722
+ std::pair<iterator,iterator> equal_range(const_reference value)
1723
+ { return this->equal_range(value, this->priv_hasher(), this->priv_equal()); }
1724
+
1725
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1726
+ //! the same hash values as the stored hasher. The difference is that
1727
+ //! "hash_func" hashes the given key instead of the value_type.
1728
+ //!
1729
+ //! "equal_func" must be a equality function that induces
1730
+ //! the same equality as key_equal. The difference is that
1731
+ //! "equal_func" compares an arbitrary key with the contained values.
1732
+ //!
1733
+ //! <b>Effects</b>: Returns a range containing all elements with equivalent
1734
+ //! keys. Returns std::make_pair(this->end(), this->end()) if no such
1735
+ //! elements exist.
1736
+ //!
1737
+ //! <b>Complexity</b>: Average case O(this->count(key, hash_func, equal_func)).
1738
+ //! Worst case O(this->size()).
1739
+ //!
1740
+ //! <b>Throws</b>: If hash_func or the equal_func throw.
1741
+ //!
1742
+ //! <b>Note</b>: This function is used when constructing a value_type
1743
+ //! is expensive and the value_type can be compared with a cheaper
1744
+ //! key type. Usually this key is part of the value_type.
1745
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1746
+ std::pair<iterator,iterator> equal_range
1747
+ (const KeyType &key, KeyHasher hash_func, KeyValueEqual equal_func)
1748
+ {
1749
+ size_type bucket_n1, bucket_n2, cnt;
1750
+ std::pair<siterator, siterator> ret = this->priv_equal_range
1751
+ (key, hash_func, equal_func, bucket_n1, bucket_n2, cnt);
1752
+ return std::pair<iterator, iterator>
1753
+ (iterator(ret.first, this), iterator(ret.second, this));
1754
+ }
1755
+
1756
+ //! <b>Effects</b>: Returns a range containing all elements with values equivalent
1757
+ //! to value. Returns std::make_pair(this->end(), this->end()) if no such
1758
+ //! elements exist.
1759
+ //!
1760
+ //! <b>Complexity</b>: Average case O(this->count(value)). Worst case O(this->size()).
1761
+ //!
1762
+ //! <b>Throws</b>: If the internal hasher or the equality functor throws.
1763
+ std::pair<const_iterator, const_iterator>
1764
+ equal_range(const_reference value) const
1765
+ { return this->equal_range(value, this->priv_hasher(), this->priv_equal()); }
1766
+
1767
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1768
+ //! the same hash values as the stored hasher. The difference is that
1769
+ //! "hash_func" hashes the given key instead of the value_type.
1770
+ //!
1771
+ //! "equal_func" must be a equality function that induces
1772
+ //! the same equality as key_equal. The difference is that
1773
+ //! "equal_func" compares an arbitrary key with the contained values.
1774
+ //!
1775
+ //! <b>Effects</b>: Returns a range containing all elements with equivalent
1776
+ //! keys. Returns std::make_pair(this->end(), this->end()) if no such
1777
+ //! elements exist.
1778
+ //!
1779
+ //! <b>Complexity</b>: Average case O(this->count(key, hash_func, equal_func)).
1780
+ //! Worst case O(this->size()).
1781
+ //!
1782
+ //! <b>Throws</b>: If the hasher or equal_func throw.
1783
+ //!
1784
+ //! <b>Note</b>: This function is used when constructing a value_type
1785
+ //! is expensive and the value_type can be compared with a cheaper
1786
+ //! key type. Usually this key is part of the value_type.
1787
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
1788
+ std::pair<const_iterator,const_iterator> equal_range
1789
+ (const KeyType &key, KeyHasher hash_func, KeyValueEqual equal_func) const
1790
+ {
1791
+ size_type bucket_n1, bucket_n2, cnt;
1792
+ std::pair<siterator, siterator> ret =
1793
+ this->priv_equal_range(key, hash_func, equal_func, bucket_n1, bucket_n2, cnt);
1794
+ return std::pair<const_iterator, const_iterator>
1795
+ (const_iterator(ret.first, this), const_iterator(ret.second, this));
1796
+ }
1797
+
1798
+ //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
1799
+ //! appropriate type. Otherwise the behavior is undefined.
1800
+ //!
1801
+ //! <b>Effects</b>: Returns: a valid iterator belonging to the unordered_set
1802
+ //! that points to the value
1803
+ //!
1804
+ //! <b>Complexity</b>: Constant.
1805
+ //!
1806
+ //! <b>Throws</b>: If the internal hash function throws.
1807
+ iterator iterator_to(reference value)
1808
+ {
1809
+ return iterator(bucket_type::s_iterator_to(this->priv_value_to_node(value)), this);
1810
+ }
1811
+
1812
+ //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
1813
+ //! appropriate type. Otherwise the behavior is undefined.
1814
+ //!
1815
+ //! <b>Effects</b>: Returns: a valid const_iterator belonging to the
1816
+ //! unordered_set that points to the value
1817
+ //!
1818
+ //! <b>Complexity</b>: Constant.
1819
+ //!
1820
+ //! <b>Throws</b>: If the internal hash function throws.
1821
+ const_iterator iterator_to(const_reference value) const
1822
+ {
1823
+ siterator sit = bucket_type::s_iterator_to(const_cast<node &>(this->priv_value_to_node(value)));
1824
+ return const_iterator(sit, this);
1825
+ }
1826
+
1827
+ //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
1828
+ //! appropriate type. Otherwise the behavior is undefined.
1829
+ //!
1830
+ //! <b>Effects</b>: Returns: a valid local_iterator belonging to the unordered_set
1831
+ //! that points to the value
1832
+ //!
1833
+ //! <b>Complexity</b>: Constant.
1834
+ //!
1835
+ //! <b>Throws</b>: Nothing.
1836
+ //!
1837
+ //! <b>Note</b>: This static function is available only if the <i>value traits</i>
1838
+ //! is stateless.
1839
+ static local_iterator s_local_iterator_to(reference value)
1840
+ {
1841
+ BOOST_STATIC_ASSERT((!stateful_value_traits));
1842
+ siterator sit = bucket_type::s_iterator_to(((hashtable_impl*)0)->priv_value_to_node(value));
1843
+ return local_iterator(sit, (hashtable_impl*)0);
1844
+ }
1845
+
1846
+ //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
1847
+ //! appropriate type. Otherwise the behavior is undefined.
1848
+ //!
1849
+ //! <b>Effects</b>: Returns: a valid const_local_iterator belonging to
1850
+ //! the unordered_set that points to the value
1851
+ //!
1852
+ //! <b>Complexity</b>: Constant.
1853
+ //!
1854
+ //! <b>Throws</b>: Nothing.
1855
+ //!
1856
+ //! <b>Note</b>: This static function is available only if the <i>value traits</i>
1857
+ //! is stateless.
1858
+ static const_local_iterator s_local_iterator_to(const_reference value)
1859
+ {
1860
+ BOOST_STATIC_ASSERT((!stateful_value_traits));
1861
+ siterator sit = bucket_type::s_iterator_to(((hashtable_impl*)0)->priv_value_to_node(const_cast<value_type&>(value)));
1862
+ return const_local_iterator(sit, (hashtable_impl*)0);
1863
+ }
1864
+
1865
+ //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
1866
+ //! appropriate type. Otherwise the behavior is undefined.
1867
+ //!
1868
+ //! <b>Effects</b>: Returns: a valid local_iterator belonging to the unordered_set
1869
+ //! that points to the value
1870
+ //!
1871
+ //! <b>Complexity</b>: Constant.
1872
+ //!
1873
+ //! <b>Throws</b>: Nothing.
1874
+ local_iterator local_iterator_to(reference value)
1875
+ {
1876
+ siterator sit = bucket_type::s_iterator_to(this->priv_value_to_node(value));
1877
+ return local_iterator(sit, this);
1878
+ }
1879
+
1880
+ //! <b>Requires</b>: value must be an lvalue and shall be in a unordered_set of
1881
+ //! appropriate type. Otherwise the behavior is undefined.
1882
+ //!
1883
+ //! <b>Effects</b>: Returns: a valid const_local_iterator belonging to
1884
+ //! the unordered_set that points to the value
1885
+ //!
1886
+ //! <b>Complexity</b>: Constant.
1887
+ //!
1888
+ //! <b>Throws</b>: Nothing.
1889
+ const_local_iterator local_iterator_to(const_reference value) const
1890
+ {
1891
+ siterator sit = bucket_type::s_iterator_to
1892
+ (const_cast<node &>(this->priv_value_to_node(value)));
1893
+ return const_local_iterator(sit, this);
1894
+ }
1895
+
1896
+ //! <b>Effects</b>: Returns the number of buckets passed in the constructor
1897
+ //! or the last rehash function.
1898
+ //!
1899
+ //! <b>Complexity</b>: Constant.
1900
+ //!
1901
+ //! <b>Throws</b>: Nothing.
1902
+ size_type bucket_count() const
1903
+ { return this->priv_bucket_count(); }
1904
+
1905
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
1906
+ //!
1907
+ //! <b>Effects</b>: Returns the number of elements in the nth bucket.
1908
+ //!
1909
+ //! <b>Complexity</b>: Constant.
1910
+ //!
1911
+ //! <b>Throws</b>: Nothing.
1912
+ size_type bucket_size(size_type n) const
1913
+ { return this->priv_bucket_pointer()[n].size(); }
1914
+
1915
+ //! <b>Effects</b>: Returns the index of the bucket in which elements
1916
+ //! with keys equivalent to k would be found, if any such element existed.
1917
+ //!
1918
+ //! <b>Complexity</b>: Constant.
1919
+ //!
1920
+ //! <b>Throws</b>: If the hash functor throws.
1921
+ //!
1922
+ //! <b>Note</b>: the return value is in the range [0, this->bucket_count()).
1923
+ size_type bucket(const key_type& k) const
1924
+ { return this->bucket(k, this->priv_hasher()); }
1925
+
1926
+ //! <b>Requires</b>: "hash_func" must be a hash function that induces
1927
+ //! the same hash values as the stored hasher. The difference is that
1928
+ //! "hash_func" hashes the given key instead of the value_type.
1929
+ //!
1930
+ //! <b>Effects</b>: Returns the index of the bucket in which elements
1931
+ //! with keys equivalent to k would be found, if any such element existed.
1932
+ //!
1933
+ //! <b>Complexity</b>: Constant.
1934
+ //!
1935
+ //! <b>Throws</b>: If hash_func throws.
1936
+ //!
1937
+ //! <b>Note</b>: the return value is in the range [0, this->bucket_count()).
1938
+ template<class KeyType, class KeyHasher>
1939
+ size_type bucket(const KeyType& k, const KeyHasher &hash_func) const
1940
+ { return this->priv_hash_to_bucket(hash_func(k)); }
1941
+
1942
+ //! <b>Effects</b>: Returns the bucket array pointer passed in the constructor
1943
+ //! or the last rehash function.
1944
+ //!
1945
+ //! <b>Complexity</b>: Constant.
1946
+ //!
1947
+ //! <b>Throws</b>: Nothing.
1948
+ bucket_ptr bucket_pointer() const
1949
+ { return this->priv_bucket_pointer(); }
1950
+
1951
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
1952
+ //!
1953
+ //! <b>Effects</b>: Returns a local_iterator pointing to the beginning
1954
+ //! of the sequence stored in the bucket n.
1955
+ //!
1956
+ //! <b>Complexity</b>: Constant.
1957
+ //!
1958
+ //! <b>Throws</b>: Nothing.
1959
+ //!
1960
+ //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
1961
+ //! containing all of the elements in the nth bucket.
1962
+ local_iterator begin(size_type n)
1963
+ { return local_iterator(this->priv_bucket_pointer()[n].begin(), this); }
1964
+
1965
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
1966
+ //!
1967
+ //! <b>Effects</b>: Returns a const_local_iterator pointing to the beginning
1968
+ //! of the sequence stored in the bucket n.
1969
+ //!
1970
+ //! <b>Complexity</b>: Constant.
1971
+ //!
1972
+ //! <b>Throws</b>: Nothing.
1973
+ //!
1974
+ //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
1975
+ //! containing all of the elements in the nth bucket.
1976
+ const_local_iterator begin(size_type n) const
1977
+ { return this->cbegin(n); }
1978
+
1979
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
1980
+ //!
1981
+ //! <b>Effects</b>: Returns a const_local_iterator pointing to the beginning
1982
+ //! of the sequence stored in the bucket n.
1983
+ //!
1984
+ //! <b>Complexity</b>: Constant.
1985
+ //!
1986
+ //! <b>Throws</b>: Nothing.
1987
+ //!
1988
+ //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
1989
+ //! containing all of the elements in the nth bucket.
1990
+ const_local_iterator cbegin(size_type n) const
1991
+ {
1992
+ siterator sit = const_cast<bucket_type&>(this->priv_bucket_pointer()[n]).begin();
1993
+ return const_local_iterator(sit, this);
1994
+ }
1995
+
1996
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
1997
+ //!
1998
+ //! <b>Effects</b>: Returns a local_iterator pointing to the end
1999
+ //! of the sequence stored in the bucket n.
2000
+ //!
2001
+ //! <b>Complexity</b>: Constant.
2002
+ //!
2003
+ //! <b>Throws</b>: Nothing.
2004
+ //!
2005
+ //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2006
+ //! containing all of the elements in the nth bucket.
2007
+ local_iterator end(size_type n)
2008
+ { return local_iterator(this->priv_bucket_pointer()[n].end(), this); }
2009
+
2010
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2011
+ //!
2012
+ //! <b>Effects</b>: Returns a const_local_iterator pointing to the end
2013
+ //! of the sequence stored in the bucket n.
2014
+ //!
2015
+ //! <b>Complexity</b>: Constant.
2016
+ //!
2017
+ //! <b>Throws</b>: Nothing.
2018
+ //!
2019
+ //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2020
+ //! containing all of the elements in the nth bucket.
2021
+ const_local_iterator end(size_type n) const
2022
+ { return this->cend(n); }
2023
+
2024
+ //! <b>Requires</b>: n is in the range [0, this->bucket_count()).
2025
+ //!
2026
+ //! <b>Effects</b>: Returns a const_local_iterator pointing to the end
2027
+ //! of the sequence stored in the bucket n.
2028
+ //!
2029
+ //! <b>Complexity</b>: Constant.
2030
+ //!
2031
+ //! <b>Throws</b>: Nothing.
2032
+ //!
2033
+ //! <b>Note</b>: [this->begin(n), this->end(n)) is a valid range
2034
+ //! containing all of the elements in the nth bucket.
2035
+ const_local_iterator cend(size_type n) const
2036
+ { return const_local_iterator(const_cast<bucket_type&>(this->priv_bucket_pointer()[n]).end(), this); }
2037
+
2038
+ //! <b>Requires</b>: new_bucket_traits can hold a pointer to a new bucket array
2039
+ //! or the same as the old bucket array with a different length. new_size is the length of the
2040
+ //! the array pointed by new_buckets. If new_bucket_traits.bucket_begin() == this->bucket_pointer()
2041
+ //! new_bucket_traits.bucket_count() can be bigger or smaller than this->bucket_count().
2042
+ //! 'new_bucket_traits' copy constructor should not throw.
2043
+ //!
2044
+ //! <b>Effects</b>: Updates the internal reference with the new bucket, erases
2045
+ //! the values from the old bucket and inserts then in the new one.
2046
+ //! Bucket traits hold by *this is assigned from new_bucket_traits.
2047
+ //! If the container is configured as incremental<>, the split bucket is set
2048
+ //! to the new bucket_count().
2049
+ //!
2050
+ //! If store_hash option is true, this method does not use the hash function.
2051
+ //!
2052
+ //! <b>Complexity</b>: Average case linear in this->size(), worst case quadratic.
2053
+ //!
2054
+ //! <b>Throws</b>: If the hasher functor throws. Basic guarantee.
2055
+ void rehash(const bucket_traits &new_bucket_traits)
2056
+ {
2057
+ const bucket_ptr new_buckets = new_bucket_traits.bucket_begin();
2058
+ size_type new_bucket_count = new_bucket_traits.bucket_count();
2059
+ const bucket_ptr old_buckets = this->priv_bucket_pointer();
2060
+ size_type old_bucket_count = this->priv_bucket_count();
2061
+
2062
+ //Check power of two bucket array if the option is activated
2063
+ BOOST_INTRUSIVE_INVARIANT_ASSERT
2064
+ (!power_2_buckets || (0 == (new_bucket_count & (new_bucket_count-1u))));
2065
+
2066
+ size_type n = this->priv_get_cache_bucket_num();
2067
+ const bool same_buffer = old_buckets == new_buckets;
2068
+ //If the new bucket length is a common factor
2069
+ //of the old one we can avoid hash calculations.
2070
+ const bool fast_shrink = (!incremental) && (old_bucket_count > new_bucket_count) &&
2071
+ (power_2_buckets ||(old_bucket_count % new_bucket_count) == 0);
2072
+ //If we are shrinking the same bucket array and it's
2073
+ //is a fast shrink, just rehash the last nodes
2074
+ size_type new_first_bucket_num = new_bucket_count;
2075
+ if(same_buffer && fast_shrink && (n < new_bucket_count)){
2076
+ n = new_bucket_count;
2077
+ new_first_bucket_num = this->priv_get_cache_bucket_num();
2078
+ }
2079
+
2080
+ //Anti-exception stuff: they destroy the elements if something goes wrong.
2081
+ //If the source and destination buckets are the same, the second rollback function
2082
+ //is harmless, because all elements have been already unlinked and destroyed
2083
+ typedef detail::init_disposer<node_algorithms> NodeDisposer;
2084
+ NodeDisposer node_disp;
2085
+ bucket_type & newbuck = new_buckets[0];
2086
+ bucket_type & oldbuck = old_buckets[0];
2087
+ detail::exception_array_disposer<bucket_type, NodeDisposer, size_type>
2088
+ rollback1(newbuck, node_disp, new_bucket_count);
2089
+ detail::exception_array_disposer<bucket_type, NodeDisposer, size_type>
2090
+ rollback2(oldbuck, node_disp, old_bucket_count);
2091
+
2092
+ //Put size in a safe value for rollback exception
2093
+ size_type size_backup = this->priv_size_traits().get_size();
2094
+ this->priv_size_traits().set_size(0);
2095
+ //Put cache to safe position
2096
+ this->priv_initialize_cache();
2097
+ this->priv_insertion_update_cache(size_type(0u));
2098
+
2099
+ //Iterate through nodes
2100
+ for(; n < old_bucket_count; ++n){
2101
+ bucket_type &old_bucket = old_buckets[n];
2102
+
2103
+ if(!fast_shrink){
2104
+ siterator before_i(old_bucket.before_begin());
2105
+ siterator end_sit(old_bucket.end());
2106
+ siterator i(old_bucket.begin());
2107
+ for(;i != end_sit; ++i){
2108
+ const value_type &v = this->priv_value_from_slist_node(i.pointed_node());
2109
+ const std::size_t hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
2110
+ const size_type new_n = this->priv_hash_to_bucket(hash_value, new_bucket_count, new_bucket_count);
2111
+ if(cache_begin && new_n < new_first_bucket_num)
2112
+ new_first_bucket_num = new_n;
2113
+ siterator last = bucket_type::s_iterator_to
2114
+ (*group_functions_t::get_last_in_group
2115
+ (hashtable_impl::dcast_bucket_ptr(i.pointed_node()), optimize_multikey_t()));
2116
+ if(same_buffer && new_n == n){
2117
+ before_i = last;
2118
+ }
2119
+ else{
2120
+ bucket_type &new_b = new_buckets[new_n];
2121
+ new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last);
2122
+ }
2123
+ i = before_i;
2124
+ }
2125
+ }
2126
+ else{
2127
+ const size_type new_n = this->priv_hash_to_bucket(n, new_bucket_count, new_bucket_count);
2128
+ if(cache_begin && new_n < new_first_bucket_num)
2129
+ new_first_bucket_num = new_n;
2130
+ bucket_type &new_b = new_buckets[new_n];
2131
+ if(!old_bucket.empty()){
2132
+ new_b.splice_after( new_b.before_begin()
2133
+ , old_bucket
2134
+ , old_bucket.before_begin()
2135
+ , hashtable_impl::priv_get_last(old_bucket));
2136
+ }
2137
+ }
2138
+ }
2139
+
2140
+ this->priv_size_traits().set_size(size_backup);
2141
+ this->priv_split_traits().set_size(new_bucket_count);
2142
+ this->priv_real_bucket_traits() = new_bucket_traits;
2143
+ this->priv_initialize_cache();
2144
+ this->priv_insertion_update_cache(new_first_bucket_num);
2145
+ rollback1.release();
2146
+ rollback2.release();
2147
+ }
2148
+
2149
+ //! <b>Requires</b>:
2150
+ //!
2151
+ //! <b>Effects</b>:
2152
+ //!
2153
+ //! <b>Complexity</b>:
2154
+ //!
2155
+ //! <b>Throws</b>:
2156
+ //!
2157
+ //! <b>Note</b>: this method is only available if incremental<true> option is activated.
2158
+ bool incremental_rehash(bool grow = true)
2159
+ {
2160
+ //This function is only available for containers with incremental hashing
2161
+ BOOST_STATIC_ASSERT(( incremental && power_2_buckets ));
2162
+ const size_type split_idx = this->priv_split_traits().get_size();
2163
+ const size_type bucket_cnt = this->priv_bucket_count();
2164
+ const bucket_ptr buck_ptr = this->priv_bucket_pointer();
2165
+
2166
+ if(grow){
2167
+ //Test if the split variable can be changed
2168
+ if(split_idx >= bucket_cnt)
2169
+ return false;
2170
+
2171
+ const size_type bucket_to_rehash = split_idx - bucket_cnt/2;
2172
+ bucket_type &old_bucket = buck_ptr[bucket_to_rehash];
2173
+ siterator before_i(old_bucket.before_begin());
2174
+ const siterator end_sit(old_bucket.end());
2175
+ siterator i(old_bucket.begin());
2176
+ this->priv_split_traits().increment();
2177
+
2178
+ //Anti-exception stuff: if an exception is thrown while
2179
+ //moving elements from old_bucket to the target bucket, all moved
2180
+ //elements are moved back to the original one.
2181
+ detail::incremental_rehash_rollback<bucket_type, split_traits> rollback
2182
+ ( buck_ptr[split_idx], old_bucket, this->priv_split_traits());
2183
+ for(;i != end_sit; ++i){
2184
+ const value_type &v = this->priv_value_from_slist_node(i.pointed_node());
2185
+ const std::size_t hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
2186
+ const size_type new_n = this->priv_hash_to_bucket(hash_value);
2187
+ siterator last = bucket_type::s_iterator_to
2188
+ (*group_functions_t::get_last_in_group
2189
+ (hashtable_impl::dcast_bucket_ptr(i.pointed_node()), optimize_multikey_t()));
2190
+ if(new_n == bucket_to_rehash){
2191
+ before_i = last;
2192
+ }
2193
+ else{
2194
+ bucket_type &new_b = buck_ptr[new_n];
2195
+ new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last);
2196
+ }
2197
+ i = before_i;
2198
+ }
2199
+ rollback.release();
2200
+ this->priv_erasure_update_cache();
2201
+ return true;
2202
+ }
2203
+ else{
2204
+ //Test if the split variable can be changed
2205
+ if(split_idx <= bucket_cnt/2)
2206
+ return false;
2207
+ const size_type target_bucket_num = split_idx - 1 - bucket_cnt/2;
2208
+ bucket_type &target_bucket = buck_ptr[target_bucket_num];
2209
+ bucket_type &source_bucket = buck_ptr[split_idx-1];
2210
+ target_bucket.splice_after(target_bucket.cbefore_begin(), source_bucket);
2211
+ this->priv_split_traits().decrement();
2212
+ this->priv_insertion_update_cache(target_bucket_num);
2213
+ return true;
2214
+ }
2215
+ }
2216
+
2217
+ //! <b>Effects</b>: If new_bucket_traits.bucket_count() is not
2218
+ //! this->bucket_count()/2 or this->bucket_count()*2, or
2219
+ //! this->split_bucket() != new_bucket_traits.bucket_count() returns false
2220
+ //! and does nothing.
2221
+ //!
2222
+ //! Otherwise, copy assigns new_bucket_traits to the internal bucket_traits
2223
+ //! and transfers all the objects from old buckets to the new ones.
2224
+ //!
2225
+ //! <b>Complexity</b>: Linear to size().
2226
+ //!
2227
+ //! <b>Throws</b>: Nothing
2228
+ //!
2229
+ //! <b>Note</b>: this method is only available if incremental<true> option is activated.
2230
+ bool incremental_rehash(const bucket_traits &new_bucket_traits)
2231
+ {
2232
+ //This function is only available for containers with incremental hashing
2233
+ BOOST_STATIC_ASSERT(( incremental && power_2_buckets ));
2234
+ size_type new_bucket_traits_size = new_bucket_traits.bucket_count();
2235
+ size_type cur_bucket_traits = this->priv_bucket_count();
2236
+ if(new_bucket_traits_size/2 != cur_bucket_traits && new_bucket_traits_size != cur_bucket_traits/2){
2237
+ return false;
2238
+ }
2239
+
2240
+ const size_type split_idx = this->split_count();
2241
+
2242
+ if(new_bucket_traits_size/2 == cur_bucket_traits){
2243
+ //Test if the split variable can be changed
2244
+ if(!(split_idx >= cur_bucket_traits))
2245
+ return false;
2246
+ }
2247
+ else{
2248
+ //Test if the split variable can be changed
2249
+ if(!(split_idx <= cur_bucket_traits/2))
2250
+ return false;
2251
+ }
2252
+
2253
+ const size_type ini_n = this->priv_get_cache_bucket_num();
2254
+ const bucket_ptr old_buckets = this->priv_bucket_pointer();
2255
+ this->priv_real_bucket_traits() = new_bucket_traits;
2256
+ if(new_bucket_traits.bucket_begin() != old_buckets){
2257
+ for(size_type n = ini_n; n < split_idx; ++n){
2258
+ bucket_type &new_bucket = new_bucket_traits.bucket_begin()[n];
2259
+ bucket_type &old_bucket = old_buckets[n];
2260
+ new_bucket.splice_after(new_bucket.cbefore_begin(), old_bucket);
2261
+ }
2262
+ //Put cache to safe position
2263
+ this->priv_initialize_cache();
2264
+ this->priv_insertion_update_cache(ini_n);
2265
+ }
2266
+ return true;
2267
+ }
2268
+
2269
+ //! <b>Requires</b>:
2270
+ //!
2271
+ //! <b>Effects</b>:
2272
+ //!
2273
+ //! <b>Complexity</b>:
2274
+ //!
2275
+ //! <b>Throws</b>:
2276
+ size_type split_count() const
2277
+ {
2278
+ //This function is only available if incremental hashing is activated
2279
+ BOOST_STATIC_ASSERT(( incremental && power_2_buckets ));
2280
+ return this->priv_split_traits().get_size();
2281
+ }
2282
+
2283
+ //! <b>Effects</b>: Returns the nearest new bucket count optimized for
2284
+ //! the container that is bigger or equal than n. This suggestion can be
2285
+ //! used to create bucket arrays with a size that will usually improve
2286
+ //! container's performance. If such value does not exist, the
2287
+ //! higher possible value is returned.
2288
+ //!
2289
+ //! <b>Complexity</b>: Amortized constant time.
2290
+ //!
2291
+ //! <b>Throws</b>: Nothing.
2292
+ static size_type suggested_upper_bucket_count(size_type n)
2293
+ {
2294
+ const std::size_t *primes = &detail::prime_list_holder<0>::prime_list[0];
2295
+ const std::size_t *primes_end = primes + detail::prime_list_holder<0>::prime_list_size;
2296
+ std::size_t const* bound = std::lower_bound(primes, primes_end, n);
2297
+ if(bound == primes_end)
2298
+ --bound;
2299
+ return size_type(*bound);
2300
+ }
2301
+
2302
+ //! <b>Effects</b>: Returns the nearest new bucket count optimized for
2303
+ //! the container that is smaller or equal than n. This suggestion can be
2304
+ //! used to create bucket arrays with a size that will usually improve
2305
+ //! container's performance. If such value does not exist, the
2306
+ //! lowest possible value is returned.
2307
+ //!
2308
+ //! <b>Complexity</b>: Amortized constant time.
2309
+ //!
2310
+ //! <b>Throws</b>: Nothing.
2311
+ static size_type suggested_lower_bucket_count(size_type n)
2312
+ {
2313
+ const std::size_t *primes = &detail::prime_list_holder<0>::prime_list[0];
2314
+ const std::size_t *primes_end = primes + detail::prime_list_holder<0>::prime_list_size;
2315
+ size_type const* bound = std::upper_bound(primes, primes_end, n);
2316
+ if(bound != primes)
2317
+ --bound;
2318
+ return size_type(*bound);
2319
+ }
2320
+
2321
+ /// @cond
2322
+ private:
2323
+
2324
+ std::size_t priv_hash_to_bucket(std::size_t hash_value) const
2325
+ { return this->priv_hash_to_bucket(hash_value, this->priv_real_bucket_traits().bucket_count(), this->priv_split_traits().get_size()); }
2326
+
2327
+ std::size_t priv_hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, std::size_t split) const
2328
+ {
2329
+ std::size_t bucket_number = hashtable_impl::priv_hash_to_bucket_impl(hash_value, bucket_cnt, power_2_buckets_t());
2330
+ if(incremental)
2331
+ if(bucket_number >= split)
2332
+ bucket_number -= bucket_cnt/2;
2333
+ return bucket_number;
2334
+ }
2335
+
2336
+ static std::size_t priv_hash_to_bucket_impl(std::size_t hash_value, std::size_t bucket_cnt, detail::false_)
2337
+ { return hash_value % bucket_cnt; }
2338
+
2339
+ static std::size_t priv_hash_to_bucket_impl(std::size_t hash_value, std::size_t bucket_cnt, detail::true_)
2340
+ { return hash_value & (bucket_cnt - 1); }
2341
+
2342
+ const key_equal &priv_equal() const
2343
+ { return static_cast<const key_equal&>(this->data_.internal_.bucket_hash_equal_.get()); }
2344
+
2345
+ key_equal &priv_equal()
2346
+ { return static_cast<key_equal&>(this->data_.internal_.bucket_hash_equal_.get()); }
2347
+
2348
+ const value_traits &priv_value_traits() const
2349
+ { return data_; }
2350
+
2351
+ value_traits &priv_value_traits()
2352
+ { return data_; }
2353
+
2354
+ value_type &priv_value_from_slist_node(slist_node_ptr n)
2355
+ { return *this->get_real_value_traits().to_value_ptr(hashtable_impl::dcast_bucket_ptr(n)); }
2356
+
2357
+ const value_type &priv_value_from_slist_node(slist_node_ptr n) const
2358
+ { return *this->get_real_value_traits().to_value_ptr(hashtable_impl::dcast_bucket_ptr(n)); }
2359
+
2360
+ const real_bucket_traits &priv_real_bucket_traits(detail::false_) const
2361
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
2362
+
2363
+ const real_bucket_traits &priv_real_bucket_traits(detail::true_) const
2364
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_.get_bucket_traits(*this); }
2365
+
2366
+ real_bucket_traits &priv_real_bucket_traits(detail::false_)
2367
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
2368
+
2369
+ real_bucket_traits &priv_real_bucket_traits(detail::true_)
2370
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_.get_bucket_traits(*this); }
2371
+
2372
+ const real_bucket_traits &priv_real_bucket_traits() const
2373
+ { return this->priv_real_bucket_traits(detail::bool_<external_bucket_traits>()); }
2374
+
2375
+ real_bucket_traits &priv_real_bucket_traits()
2376
+ { return this->priv_real_bucket_traits(detail::bool_<external_bucket_traits>()); }
2377
+
2378
+ const bucket_traits &priv_bucket_traits() const
2379
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
2380
+
2381
+ bucket_traits &priv_bucket_traits()
2382
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
2383
+
2384
+ const hasher &priv_hasher() const
2385
+ { return static_cast<const hasher&>(this->data_.internal_.bucket_hash_equal_.bucket_hash.get()); }
2386
+
2387
+ hasher &priv_hasher()
2388
+ { return static_cast<hasher&>(this->data_.internal_.bucket_hash_equal_.bucket_hash.get()); }
2389
+
2390
+ bucket_ptr priv_bucket_pointer() const
2391
+ { return this->priv_real_bucket_traits().bucket_begin(); }
2392
+
2393
+ size_type priv_bucket_count() const
2394
+ { return this->priv_real_bucket_traits().bucket_count(); }
2395
+
2396
+ node &priv_value_to_node(value_type &v)
2397
+ { return *this->get_real_value_traits().to_node_ptr(v); }
2398
+
2399
+ const node &priv_value_to_node(const value_type &v) const
2400
+ { return *this->get_real_value_traits().to_node_ptr(v); }
2401
+
2402
+ size_traits &priv_size_traits()
2403
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_; }
2404
+
2405
+ const size_traits &priv_size_traits() const
2406
+ { return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_; }
2407
+
2408
+ split_traits &priv_split_traits()
2409
+ { return this->data_.internal_; }
2410
+
2411
+ const split_traits &priv_split_traits() const
2412
+ { return this->data_.internal_; }
2413
+
2414
+ template<class Disposer>
2415
+ void priv_erase_range_impl
2416
+ (size_type bucket_num, siterator before_first_it, siterator end_sit, Disposer disposer, size_type &num_erased)
2417
+ {
2418
+ const bucket_ptr buckets = this->priv_bucket_pointer();
2419
+ bucket_type &b = buckets[bucket_num];
2420
+
2421
+ if(before_first_it == b.before_begin() && end_sit == b.end()){
2422
+ this->priv_erase_range_impl(bucket_num, 1, disposer, num_erased);
2423
+ }
2424
+ else{
2425
+ num_erased = 0;
2426
+ siterator to_erase(before_first_it);
2427
+ ++to_erase;
2428
+ slist_node_ptr end_ptr = end_sit.pointed_node();
2429
+ while(to_erase != end_sit){
2430
+ group_functions_t::erase_from_group(end_ptr, hashtable_impl::dcast_bucket_ptr(to_erase.pointed_node()), optimize_multikey_t());
2431
+ to_erase = b.erase_after_and_dispose(before_first_it, make_node_disposer(disposer));
2432
+ ++num_erased;
2433
+ }
2434
+ this->priv_size_traits().set_size(this->priv_size_traits().get_size()-num_erased);
2435
+ }
2436
+ }
2437
+
2438
+ template<class Disposer>
2439
+ void priv_erase_range_impl
2440
+ (size_type first_bucket_num, size_type num_buckets, Disposer disposer, size_type &num_erased)
2441
+ {
2442
+ //Now fully clear the intermediate buckets
2443
+ const bucket_ptr buckets = this->priv_bucket_pointer();
2444
+ num_erased = 0;
2445
+ for(size_type i = first_bucket_num; i < (num_buckets + first_bucket_num); ++i){
2446
+ bucket_type &b = buckets[i];
2447
+ siterator b_begin(b.before_begin());
2448
+ siterator nxt(b_begin);
2449
+ ++nxt;
2450
+ siterator end_sit(b.end());
2451
+ while(nxt != end_sit){
2452
+ group_functions_t::init_group(hashtable_impl::dcast_bucket_ptr(nxt.pointed_node()), optimize_multikey_t());
2453
+ nxt = b.erase_after_and_dispose
2454
+ (b_begin, make_node_disposer(disposer));
2455
+ this->priv_size_traits().decrement();
2456
+ ++num_erased;
2457
+ }
2458
+ }
2459
+ }
2460
+
2461
+ template<class Disposer>
2462
+ void priv_erase_range( siterator before_first_it, size_type first_bucket
2463
+ , siterator last_it, size_type last_bucket
2464
+ , Disposer disposer)
2465
+ {
2466
+ size_type num_erased;
2467
+ if (first_bucket == last_bucket){
2468
+ this->priv_erase_range_impl(first_bucket, before_first_it, last_it, disposer, num_erased);
2469
+ }
2470
+ else {
2471
+ bucket_type *b = (&this->priv_bucket_pointer()[0]);
2472
+ this->priv_erase_range_impl(first_bucket, before_first_it, b[first_bucket].end(), disposer, num_erased);
2473
+ if(size_type n = (last_bucket - first_bucket - 1))
2474
+ this->priv_erase_range_impl(first_bucket + 1, n, disposer, num_erased);
2475
+ this->priv_erase_range_impl(last_bucket, b[last_bucket].before_begin(), last_it, disposer, num_erased);
2476
+ }
2477
+ }
2478
+
2479
+ static node_ptr dcast_bucket_ptr(typename slist_impl::node_ptr p)
2480
+ { return pointer_traits<node_ptr>::pointer_to(static_cast<node&>(*p)); }
2481
+
2482
+ std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const
2483
+ { return node_traits::get_hash(this->get_real_value_traits().to_node_ptr(v)); }
2484
+
2485
+ std::size_t priv_stored_or_compute_hash(const value_type &v, detail::false_) const
2486
+ { return this->priv_hasher()(v); }
2487
+
2488
+ std::size_t priv_stored_hash(slist_node_ptr n, detail::true_) const
2489
+ { return node_traits::get_hash(hashtable_impl::dcast_bucket_ptr(n)); }
2490
+
2491
+ std::size_t priv_stored_hash(slist_node_ptr, detail::false_) const
2492
+ {
2493
+ //This code should never be reached!
2494
+ BOOST_INTRUSIVE_INVARIANT_ASSERT(0);
2495
+ return 0;
2496
+ }
2497
+
2498
+ static void priv_clear_group_nodes(bucket_type &b, detail::true_)
2499
+ {
2500
+ siterator it(b.begin()), itend(b.end());
2501
+ while(it != itend){
2502
+ node_ptr to_erase(hashtable_impl::dcast_bucket_ptr(it.pointed_node()));
2503
+ ++it;
2504
+ group_algorithms::init(to_erase);
2505
+ }
2506
+ }
2507
+
2508
+ static void priv_clear_group_nodes(bucket_type &, detail::false_)
2509
+ {}
2510
+
2511
+ std::size_t priv_get_bucket_num(siterator it)
2512
+ { return this->priv_get_bucket_num_hash_dispatch(it, store_hash_t()); }
2513
+
2514
+ std::size_t priv_get_bucket_num_hash_dispatch(siterator it, detail::true_)
2515
+ {
2516
+ return this->priv_hash_to_bucket
2517
+ (this->priv_stored_hash(it.pointed_node(), store_hash_t()));
2518
+ }
2519
+
2520
+ std::size_t priv_get_bucket_num_hash_dispatch(siterator it, detail::false_)
2521
+ { return this->priv_get_bucket_num_no_hash_store(it, optimize_multikey_t()); }
2522
+
2523
+ std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::true_)
2524
+ {
2525
+ const bucket_ptr f(this->priv_bucket_pointer()), l(f + this->priv_bucket_count() - 1);
2526
+ slist_node_ptr bb = group_functions_t::get_bucket_before_begin
2527
+ ( f->end().pointed_node()
2528
+ , l->end().pointed_node()
2529
+ , hashtable_impl::dcast_bucket_ptr(it.pointed_node()));
2530
+ //Now get the bucket_impl from the iterator
2531
+ const bucket_type &b = static_cast<const bucket_type&>
2532
+ (bucket_type::slist_type::container_from_end_iterator(bucket_type::s_iterator_to(*bb)));
2533
+ //Now just calculate the index b has in the bucket array
2534
+ return static_cast<size_type>(&b - &*f);
2535
+ }
2536
+
2537
+ std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::false_)
2538
+ {
2539
+ bucket_ptr f(this->priv_bucket_pointer()), l(f + this->priv_bucket_count() - 1);
2540
+ slist_node_ptr first_ptr(f->cend().pointed_node())
2541
+ , last_ptr(l->cend().pointed_node());
2542
+
2543
+ //The end node is embedded in the singly linked list:
2544
+ //iterate until we reach it.
2545
+ while(!(first_ptr <= it.pointed_node() && it.pointed_node() <= last_ptr)){
2546
+ ++it;
2547
+ }
2548
+ //Now get the bucket_impl from the iterator
2549
+ const bucket_type &b = static_cast<const bucket_type&>
2550
+ (bucket_type::container_from_end_iterator(it));
2551
+
2552
+ //Now just calculate the index b has in the bucket array
2553
+ return static_cast<std::size_t>(&b - &*f);
2554
+ }
2555
+
2556
+ siterator priv_get_previous
2557
+ (bucket_type &b, siterator i)
2558
+ { return this->priv_get_previous(b, i, optimize_multikey_t()); }
2559
+
2560
+ siterator priv_get_previous
2561
+ (bucket_type &b, siterator i, detail::true_)
2562
+ {
2563
+ node_ptr elem(hashtable_impl::dcast_bucket_ptr(i.pointed_node()));
2564
+ node_ptr prev_in_group(group_traits::get_next(elem));
2565
+ bool first_in_group = node_traits::get_next(prev_in_group) != elem;
2566
+ typename bucket_type::node &n = first_in_group
2567
+ ? *group_functions_t::get_prev_to_first_in_group(b.end().pointed_node(), elem)
2568
+ : *group_traits::get_next(elem)
2569
+ ;
2570
+ return bucket_type::s_iterator_to(n);
2571
+ }
2572
+
2573
+ siterator priv_get_previous
2574
+ (bucket_type &b, siterator i, detail::false_)
2575
+ { return b.previous(i); }
2576
+
2577
+ static siterator priv_get_last(bucket_type &b)
2578
+ { return hashtable_impl::priv_get_last(b, optimize_multikey_t()); }
2579
+
2580
+ static siterator priv_get_last(bucket_type &b, detail::true_)
2581
+ {
2582
+ //First find the last node of p's group.
2583
+ //This requires checking the first node of the next group or
2584
+ //the bucket node.
2585
+ slist_node_ptr end_ptr(b.end().pointed_node());
2586
+ node_ptr possible_end(node_traits::get_next( hashtable_impl::dcast_bucket_ptr(end_ptr)));
2587
+ node_ptr last_node_group(possible_end);
2588
+
2589
+ while(end_ptr != possible_end){
2590
+ last_node_group = group_traits::get_next(hashtable_impl::dcast_bucket_ptr(possible_end));
2591
+ possible_end = node_traits::get_next(last_node_group);
2592
+ }
2593
+ return bucket_type::s_iterator_to(*last_node_group);
2594
+ }
2595
+
2596
+ static siterator priv_get_last(bucket_type &b, detail::false_)
2597
+ { return b.previous(b.end()); }
2598
+
2599
+ template<class Disposer>
2600
+ void priv_erase(const_iterator i, Disposer disposer, detail::true_)
2601
+ {
2602
+ slist_node_ptr elem(i.slist_it().pointed_node());
2603
+ slist_node_ptr f_bucket_end, l_bucket_end;
2604
+ if(store_hash){
2605
+ f_bucket_end = l_bucket_end =
2606
+ (this->priv_bucket_pointer()
2607
+ [this->priv_hash_to_bucket
2608
+ (this->priv_stored_hash(elem, store_hash_t()))
2609
+ ]).before_begin().pointed_node();
2610
+ }
2611
+ else{
2612
+ f_bucket_end = this->priv_bucket_pointer()->cend().pointed_node();
2613
+ l_bucket_end = f_bucket_end + this->priv_bucket_count() - 1;
2614
+ }
2615
+ node_ptr nxt_in_group;
2616
+ siterator prev = bucket_type::s_iterator_to
2617
+ (*group_functions_t::get_previous_and_next_in_group
2618
+ ( elem, nxt_in_group, f_bucket_end, l_bucket_end)
2619
+ );
2620
+ bucket_type::s_erase_after_and_dispose(prev, make_node_disposer(disposer));
2621
+ if(nxt_in_group)
2622
+ group_algorithms::unlink_after(nxt_in_group);
2623
+ if(safemode_or_autounlink)
2624
+ group_algorithms::init(hashtable_impl::dcast_bucket_ptr(elem));
2625
+ }
2626
+
2627
+ template <class Disposer>
2628
+ void priv_erase(const_iterator i, Disposer disposer, detail::false_)
2629
+ {
2630
+ siterator to_erase(i.slist_it());
2631
+ bucket_type &b = this->priv_bucket_pointer()[this->priv_get_bucket_num(to_erase)];
2632
+ siterator prev(this->priv_get_previous(b, to_erase));
2633
+ b.erase_after_and_dispose(prev, make_node_disposer(disposer));
2634
+ }
2635
+
2636
+ bucket_ptr priv_invalid_bucket() const
2637
+ {
2638
+ const real_bucket_traits &rbt = this->priv_real_bucket_traits();
2639
+ return rbt.bucket_begin() + rbt.bucket_count();
2640
+ }
2641
+
2642
+ siterator priv_invalid_local_it() const
2643
+ { return this->priv_invalid_bucket()->end(); }
2644
+
2645
+ siterator priv_begin() const
2646
+ { return this->priv_begin(cache_begin_t()); }
2647
+
2648
+ siterator priv_begin(detail::false_) const
2649
+ {
2650
+ size_type n = 0;
2651
+ size_type bucket_cnt = this->priv_bucket_count();
2652
+ for (n = 0; n < bucket_cnt; ++n){
2653
+ bucket_type &b = this->priv_bucket_pointer()[n];
2654
+ if(!b.empty()){
2655
+ return b.begin();
2656
+ }
2657
+ }
2658
+ return this->priv_invalid_local_it();
2659
+ }
2660
+
2661
+ siterator priv_begin(detail::true_) const
2662
+ {
2663
+ if(this->data_.internal_.bucket_hash_equal_.cached_begin_ == this->priv_invalid_bucket()){
2664
+ return this->priv_invalid_local_it();
2665
+ }
2666
+ else{
2667
+ return this->data_.internal_.bucket_hash_equal_.cached_begin_->begin();
2668
+ }
2669
+ }
2670
+
2671
+ void priv_initialize_cache()
2672
+ { this->priv_initialize_cache(cache_begin_t()); }
2673
+
2674
+ void priv_initialize_cache(detail::true_)
2675
+ { this->data_.internal_.bucket_hash_equal_.cached_begin_ = this->priv_invalid_bucket(); }
2676
+
2677
+ void priv_initialize_cache(detail::false_)
2678
+ {}
2679
+
2680
+ void priv_insertion_update_cache(size_type insertion_bucket)
2681
+ { this->priv_insertion_update_cache(insertion_bucket, cache_begin_t()); }
2682
+
2683
+ void priv_insertion_update_cache(size_type insertion_bucket, detail::true_)
2684
+ {
2685
+ bucket_ptr p = this->priv_bucket_pointer() + insertion_bucket;
2686
+ if(p < this->data_.internal_.bucket_hash_equal_.cached_begin_){
2687
+ this->data_.internal_.bucket_hash_equal_.cached_begin_ = p;
2688
+ }
2689
+ }
2690
+
2691
+ void priv_insertion_update_cache(size_type, detail::false_)
2692
+ {}
2693
+
2694
+ void priv_erasure_update_cache(size_type first_bucket, size_type last_bucket)
2695
+ { this->priv_erasure_update_cache(first_bucket, last_bucket, cache_begin_t()); }
2696
+
2697
+ void priv_erasure_update_cache(size_type first_bucket_num, size_type last_bucket_num, detail::true_)
2698
+ {
2699
+ //If the last bucket is the end, the cache must be updated
2700
+ //to the last position if all
2701
+ if(this->priv_get_cache_bucket_num() == first_bucket_num &&
2702
+ this->priv_bucket_pointer()[first_bucket_num].empty() ){
2703
+ this->priv_set_cache(this->priv_bucket_pointer() + last_bucket_num);
2704
+ this->priv_erasure_update_cache();
2705
+ }
2706
+ }
2707
+
2708
+ void priv_erasure_update_cache(size_type, size_type, detail::false_)
2709
+ {}
2710
+
2711
+ void priv_erasure_update_cache()
2712
+ { this->priv_erasure_update_cache(cache_begin_t()); }
2713
+
2714
+ void priv_erasure_update_cache(detail::true_)
2715
+ {
2716
+ if(constant_time_size && !size()){
2717
+ this->priv_initialize_cache();
2718
+ }
2719
+ else{
2720
+ size_type current_n = this->data_.internal_.bucket_hash_equal_.cached_begin_ - this->priv_bucket_pointer();
2721
+ for( const size_type num_buckets = this->priv_bucket_count()
2722
+ ; current_n < num_buckets
2723
+ ; ++current_n, ++this->data_.internal_.bucket_hash_equal_.cached_begin_){
2724
+ if(!this->data_.internal_.bucket_hash_equal_.cached_begin_->empty()){
2725
+ return;
2726
+ }
2727
+ }
2728
+ this->priv_initialize_cache();
2729
+ }
2730
+ }
2731
+
2732
+ void priv_erasure_update_cache(detail::false_)
2733
+ {}
2734
+
2735
+ void priv_swap_cache(detail::true_, hashtable_impl &other)
2736
+ {
2737
+ std::swap( this->data_.internal_.bucket_hash_equal_.cached_begin_
2738
+ , other.data_.internal_.bucket_hash_equal_.cached_begin_);
2739
+ }
2740
+
2741
+ void priv_swap_cache(detail::false_, hashtable_impl &)
2742
+ {}
2743
+
2744
+ bucket_ptr priv_get_cache()
2745
+ { return this->priv_get_cache(cache_begin_t()); }
2746
+
2747
+ bucket_ptr priv_get_cache(detail::true_)
2748
+ { return this->data_.internal_.bucket_hash_equal_.cached_begin_; }
2749
+
2750
+ bucket_ptr priv_get_cache(detail::false_)
2751
+ { return this->priv_bucket_pointer(); }
2752
+
2753
+ void priv_set_cache(const bucket_ptr &p)
2754
+ { this->data_.internal_.bucket_hash_equal_.set_cache(p); }
2755
+
2756
+ size_type priv_get_cache_bucket_num()
2757
+ { return this->priv_get_cache_bucket_num(cache_begin_t()); }
2758
+
2759
+ size_type priv_get_cache_bucket_num(detail::true_)
2760
+ { return this->data_.internal_.bucket_hash_equal_.cached_begin_ - this->priv_bucket_pointer(); }
2761
+
2762
+ size_type priv_get_cache_bucket_num(detail::false_)
2763
+ { return 0u; }
2764
+
2765
+ void priv_clear_buckets()
2766
+ {
2767
+ this->priv_clear_buckets
2768
+ ( this->priv_get_cache()
2769
+ , this->priv_bucket_count() - (this->priv_get_cache() - this->priv_bucket_pointer()));
2770
+ }
2771
+
2772
+ void priv_initialize_buckets()
2773
+ { this->priv_clear_buckets(this->priv_bucket_pointer(), this->priv_bucket_count()); }
2774
+
2775
+ void priv_clear_buckets(bucket_ptr buckets_ptr, size_type bucket_cnt)
2776
+ {
2777
+ for(; bucket_cnt--; ++buckets_ptr){
2778
+ if(safemode_or_autounlink){
2779
+ hashtable_impl::priv_clear_group_nodes(*buckets_ptr, optimize_multikey_t());
2780
+ buckets_ptr->clear_and_dispose(detail::init_disposer<node_algorithms>());
2781
+ }
2782
+ else{
2783
+ buckets_ptr->clear();
2784
+ }
2785
+ }
2786
+ this->priv_initialize_cache();
2787
+ }
2788
+
2789
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
2790
+ siterator priv_find
2791
+ ( const KeyType &key, KeyHasher hash_func
2792
+ , KeyValueEqual equal_func, size_type &bucket_number, std::size_t &h, siterator &previt) const
2793
+ {
2794
+ h = hash_func(key);
2795
+ return this->priv_find_with_hash(key, equal_func, bucket_number, h, previt);
2796
+ }
2797
+
2798
+ template<class KeyType, class KeyValueEqual>
2799
+ siterator priv_find_with_hash
2800
+ ( const KeyType &key, KeyValueEqual equal_func, size_type &bucket_number, const std::size_t h, siterator &previt) const
2801
+ {
2802
+ bucket_number = this->priv_hash_to_bucket(h);
2803
+ bucket_type &b = this->priv_bucket_pointer()[bucket_number];
2804
+ previt = b.before_begin();
2805
+ if(constant_time_size && this->empty()){
2806
+ return this->priv_invalid_local_it();
2807
+ }
2808
+
2809
+ siterator it = previt;
2810
+ ++it;
2811
+
2812
+ while(it != b.end()){
2813
+ const value_type &v = this->priv_value_from_slist_node(it.pointed_node());
2814
+ if(compare_hash){
2815
+ std::size_t vh = this->priv_stored_or_compute_hash(v, store_hash_t());
2816
+ if(h == vh && equal_func(key, v)){
2817
+ return it;
2818
+ }
2819
+ }
2820
+ else if(equal_func(key, v)){
2821
+ return it;
2822
+ }
2823
+ if(optimize_multikey){
2824
+ previt = bucket_type::s_iterator_to
2825
+ (*group_functions_t::get_last_in_group
2826
+ (hashtable_impl::dcast_bucket_ptr(it.pointed_node()), optimize_multikey_t()));
2827
+ it = previt;
2828
+ }
2829
+ else{
2830
+ previt = it;
2831
+ }
2832
+ ++it;
2833
+ }
2834
+ previt = b.before_begin();
2835
+ return this->priv_invalid_local_it();
2836
+ }
2837
+
2838
+ iterator priv_insert_equal_with_hash(reference value, std::size_t hash_value)
2839
+ {
2840
+ size_type bucket_num;
2841
+ siterator prev;
2842
+ siterator it = this->priv_find_with_hash
2843
+ (value, this->priv_equal(), bucket_num, hash_value, prev);
2844
+ return this->priv_insert_equal_find(value, bucket_num, hash_value, it);
2845
+ }
2846
+
2847
+ iterator priv_insert_equal_find(reference value, size_type bucket_num, std::size_t hash_value, siterator it)
2848
+ {
2849
+ bucket_type &b = this->priv_bucket_pointer()[bucket_num];
2850
+ bool found_equal = it != this->priv_invalid_local_it();
2851
+ if(!found_equal){
2852
+ it = b.before_begin();
2853
+ }
2854
+ //Now store hash if needed
2855
+ node_ptr n = pointer_traits<node_ptr>::pointer_to(this->priv_value_to_node(value));
2856
+ node_functions_t::store_hash(n, hash_value, store_hash_t());
2857
+ //Checks for some modes
2858
+ if(safemode_or_autounlink)
2859
+ BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(node_algorithms::unique(n));
2860
+ //Shorcut for optimize_multikey cases
2861
+ if(optimize_multikey){
2862
+ node_ptr first_in_group = found_equal ?
2863
+ hashtable_impl::dcast_bucket_ptr(it.pointed_node()) : node_ptr();
2864
+ group_functions_t::insert_in_group(first_in_group, n, optimize_multikey_t());
2865
+ }
2866
+ //Update cache and increment size if needed
2867
+ this->priv_insertion_update_cache(bucket_num);
2868
+ this->priv_size_traits().increment();
2869
+ //Insert the element in the bucket after it
2870
+ return iterator(b.insert_after(it, *n), this);
2871
+ }
2872
+
2873
+ template<class KeyType, class KeyHasher, class KeyValueEqual>
2874
+ std::pair<siterator, siterator> priv_equal_range
2875
+ ( const KeyType &key
2876
+ , KeyHasher hash_func
2877
+ , KeyValueEqual equal_func
2878
+ , size_type &bucket_number_first
2879
+ , size_type &bucket_number_second
2880
+ , size_type &cnt) const
2881
+ {
2882
+ std::size_t h;
2883
+ cnt = 0;
2884
+ siterator prev;
2885
+ //Let's see if the element is present
2886
+ std::pair<siterator, siterator> to_return
2887
+ ( this->priv_find(key, hash_func, equal_func, bucket_number_first, h, prev)
2888
+ , this->priv_invalid_local_it());
2889
+ if(to_return.first == to_return.second){
2890
+ bucket_number_second = bucket_number_first;
2891
+ return to_return;
2892
+ }
2893
+ {
2894
+ //If it's present, find the first that it's not equal in
2895
+ //the same bucket
2896
+ bucket_type &b = this->priv_bucket_pointer()[bucket_number_first];
2897
+ siterator it = to_return.first;
2898
+ if(optimize_multikey){
2899
+ to_return.second = bucket_type::s_iterator_to
2900
+ (*node_traits::get_next(group_functions_t::get_last_in_group
2901
+ (hashtable_impl::dcast_bucket_ptr(it.pointed_node()), optimize_multikey_t())));
2902
+ cnt = std::distance(it, to_return.second);
2903
+ if(to_return.second != b.end()){
2904
+ bucket_number_second = bucket_number_first;
2905
+ return to_return;
2906
+ }
2907
+ }
2908
+ else{
2909
+ ++cnt;
2910
+ ++it;
2911
+ while(it != b.end()){
2912
+ const value_type &v = this->priv_value_from_slist_node(it.pointed_node());
2913
+ if(compare_hash){
2914
+ std::size_t hv = this->priv_stored_or_compute_hash(v, store_hash_t());
2915
+ if(hv != h || !equal_func(key, v)){
2916
+ to_return.second = it;
2917
+ bucket_number_second = bucket_number_first;
2918
+ return to_return;
2919
+ }
2920
+ }
2921
+ else if(!equal_func(key, v)){
2922
+ to_return.second = it;
2923
+ bucket_number_second = bucket_number_first;
2924
+ return to_return;
2925
+ }
2926
+ ++it;
2927
+ ++cnt;
2928
+ }
2929
+ }
2930
+ }
2931
+
2932
+ //If we reached the end, find the first, non-empty bucket
2933
+ for(bucket_number_second = bucket_number_first+1
2934
+ ; bucket_number_second != this->priv_bucket_count()
2935
+ ; ++bucket_number_second){
2936
+ bucket_type &b = this->priv_bucket_pointer()[bucket_number_second];
2937
+ if(!b.empty()){
2938
+ to_return.second = b.begin();
2939
+ return to_return;
2940
+ }
2941
+ }
2942
+
2943
+ //Otherwise, return the end node
2944
+ to_return.second = this->priv_invalid_local_it();
2945
+ return to_return;
2946
+ }
2947
+ /// @endcond
2948
+ };
2949
+
2950
+ /// @cond
2951
+ #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
2952
+ template < class T
2953
+ , bool UniqueKeys
2954
+ , class O1 = none, class O2 = none
2955
+ , class O3 = none, class O4 = none
2956
+ , class O5 = none, class O6 = none
2957
+ , class O7 = none, class O8 = none
2958
+ , class O9 = none, class O10= none
2959
+ >
2960
+ #else
2961
+ template <class T, bool UniqueKeys, class ...Options>
2962
+ #endif
2963
+ struct make_hashtable_opt
2964
+ {
2965
+ typedef typename pack_options
2966
+ < uset_defaults<T>,
2967
+ #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
2968
+ O1, O2, O3, O4, O5, O6, O7, O8, O9, O10
2969
+ #else
2970
+ Options...
2971
+ #endif
2972
+ >::type packed_options;
2973
+
2974
+ //Real value traits must be calculated from options
2975
+ typedef typename detail::get_value_traits
2976
+ <T, typename packed_options::value_traits>::type value_traits;
2977
+ static const bool external_value_traits =
2978
+ detail::external_value_traits_bool_is_true<value_traits>::value;/*
2979
+ static const bool resizable_bucket_traits =
2980
+ detail::resizable_bool_is_true<bucket_traits_traits>::value;*/
2981
+ typedef typename detail::eval_if_c
2982
+ < external_value_traits
2983
+ , detail::eval_value_traits<value_traits>
2984
+ , detail::identity<value_traits>
2985
+ >::type real_value_traits;
2986
+ typedef typename packed_options::bucket_traits specified_bucket_traits;
2987
+
2988
+ //Real bucket traits must be calculated from options and calculated value_traits
2989
+ typedef typename detail::get_slist_impl
2990
+ <typename detail::reduced_slist_node_traits
2991
+ <typename real_value_traits::node_traits>::type
2992
+ >::type slist_impl;
2993
+
2994
+ typedef typename
2995
+ detail::if_c< detail::is_same
2996
+ < specified_bucket_traits
2997
+ , default_bucket_traits
2998
+ >::value
2999
+ , detail::bucket_traits_impl<slist_impl>
3000
+ , specified_bucket_traits
3001
+ >::type real_bucket_traits;
3002
+
3003
+ typedef detail::usetopt
3004
+ < value_traits
3005
+ , typename packed_options::hash
3006
+ , typename packed_options::equal
3007
+ , typename packed_options::size_type
3008
+ , real_bucket_traits
3009
+ , (std::size_t(UniqueKeys)*detail::hash_bool_flags::unique_keys_pos)
3010
+ | (std::size_t(packed_options::constant_time_size)*detail::hash_bool_flags::constant_time_size_pos)
3011
+ | (std::size_t(packed_options::power_2_buckets)*detail::hash_bool_flags::power_2_buckets_pos)
3012
+ | (std::size_t(packed_options::cache_begin)*detail::hash_bool_flags::cache_begin_pos)
3013
+ | (std::size_t(packed_options::compare_hash)*detail::hash_bool_flags::compare_hash_pos)
3014
+ | (std::size_t(packed_options::incremental)*detail::hash_bool_flags::incremental_pos)
3015
+ > type;
3016
+ };
3017
+ /// @endcond
3018
+
3019
+ //! Helper metafunction to define a \c hashtable that yields to the same type when the
3020
+ //! same options (either explicitly or implicitly) are used.
3021
+ #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
3022
+ template<class T, class ...Options>
3023
+ #else
3024
+ template<class T, class O1 = none, class O2 = none
3025
+ , class O3 = none, class O4 = none
3026
+ , class O5 = none, class O6 = none
3027
+ , class O7 = none, class O8 = none
3028
+ , class O9 = none, class O10= none
3029
+ >
3030
+ #endif
3031
+ struct make_hashtable
3032
+ {
3033
+ /// @cond
3034
+ typedef hashtable_impl
3035
+ < typename make_hashtable_opt
3036
+ <T, false,
3037
+ #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
3038
+ O1, O2, O3, O4, O5, O6, O7, O8, O9, O10
3039
+ #else
3040
+ Options...
3041
+ #endif
3042
+ >::type
3043
+ > implementation_defined;
3044
+
3045
+ /// @endcond
3046
+ typedef implementation_defined type;
3047
+ };
3048
+
3049
+ #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
3050
+
3051
+ #if defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
3052
+ template<class T, class ...Options>
3053
+ #else
3054
+ template<class T, class O1, class O2, class O3, class O4, class O5, class O6, class O7, class O8, class O9, class O10>
3055
+ #endif
3056
+ class hashtable
3057
+ : public make_hashtable<T,
3058
+ #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
3059
+ O1, O2, O3, O4, O5, O6, O7, O8, O9, O10
3060
+ #else
3061
+ Options...
3062
+ #endif
3063
+ >::type
3064
+ {
3065
+ typedef typename make_hashtable<T,
3066
+ #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
3067
+ O1, O2, O3, O4, O5, O6, O7, O8, O9, O10
3068
+ #else
3069
+ Options...
3070
+ #endif
3071
+ >::type Base;
3072
+ BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable)
3073
+
3074
+ public:
3075
+ typedef typename Base::value_traits value_traits;
3076
+ typedef typename Base::real_value_traits real_value_traits;
3077
+ typedef typename Base::iterator iterator;
3078
+ typedef typename Base::const_iterator const_iterator;
3079
+ typedef typename Base::bucket_ptr bucket_ptr;
3080
+ typedef typename Base::size_type size_type;
3081
+ typedef typename Base::hasher hasher;
3082
+ typedef typename Base::bucket_traits bucket_traits;
3083
+ typedef typename Base::key_equal key_equal;
3084
+
3085
+ //Assert if passed value traits are compatible with the type
3086
+ BOOST_STATIC_ASSERT((detail::is_same<typename real_value_traits::value_type, T>::value));
3087
+
3088
+ hashtable ( const bucket_traits &b_traits
3089
+ , const hasher & hash_func = hasher()
3090
+ , const key_equal &equal_func = key_equal()
3091
+ , const value_traits &v_traits = value_traits())
3092
+ : Base(b_traits, hash_func, equal_func, v_traits)
3093
+ {}
3094
+
3095
+ hashtable(BOOST_RV_REF(hashtable) x)
3096
+ : Base(::boost::move(static_cast<Base&>(x)))
3097
+ {}
3098
+
3099
+ hashtable& operator=(BOOST_RV_REF(hashtable) x)
3100
+ { this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
3101
+ };
3102
+
3103
+ #endif
3104
+
3105
+ } //namespace intrusive
3106
+ } //namespace boost
3107
+
3108
+ #include <boost/intrusive/detail/config_end.hpp>
3109
+
3110
+ #endif //BOOST_INTRUSIVE_HASHTABLE_HPP