passenger 5.1.4 → 5.1.5

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 (542) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +9 -0
  3. data/CHANGELOG +9 -0
  4. data/build/cxx_tests.rb +11 -1
  5. data/build/documentation.rb +0 -32
  6. data/build/support/cxx_dependency_map.rb +602 -2
  7. data/build/test_basics.rb +3 -3
  8. data/dev/boost-patches/0001-Patch-boost-thread-so-that-oxt-thread-can-use-it.patch +48 -0
  9. data/dev/boost-patches/0002-Make-boost-thread_interrupted-derive-from-oxt-tracab.patch +33 -0
  10. data/dev/boost-patches/0003-Disable-a-Clang-pragma-to-prevent-warnings-on-OS-X.patch +25 -0
  11. data/dev/ci/README.md +121 -0
  12. data/dev/ci/lib/functions.sh +129 -0
  13. data/dev/ci/lib/set-container-envvars.sh +46 -0
  14. data/dev/ci/lib/setup-container.sh +43 -0
  15. data/dev/ci/run-tests-natively +24 -0
  16. data/dev/ci/run-tests-with-docker +42 -0
  17. data/dev/ci/scripts/debug-console-wrapper.sh +27 -0
  18. data/dev/ci/scripts/docker-entrypoint-stage2.sh +17 -0
  19. data/dev/ci/scripts/docker-entrypoint.sh +17 -0
  20. data/dev/ci/scripts/inituidgid +17 -0
  21. data/dev/ci/scripts/run-tests-natively-stage2.sh +17 -0
  22. data/dev/ci/scripts/setup-host-natively.sh +11 -0
  23. data/dev/ci/setup-host +50 -0
  24. data/dev/ci/tests/apache2/run +6 -0
  25. data/dev/ci/tests/apache2/setup +4 -0
  26. data/dev/ci/tests/cxx/run +9 -0
  27. data/dev/ci/tests/cxx/setup +4 -0
  28. data/dev/ci/tests/nginx-dynamic/run +20 -0
  29. data/dev/ci/tests/nginx-dynamic/setup +4 -0
  30. data/dev/ci/tests/nginx/run +5 -0
  31. data/dev/ci/tests/nginx/setup +4 -0
  32. data/dev/ci/tests/nodejs/run +4 -0
  33. data/dev/ci/tests/nodejs/setup +4 -0
  34. data/dev/ci/tests/ruby/run +4 -0
  35. data/dev/ci/tests/ruby/setup +4 -0
  36. data/dev/ci/tests/source-packaging/run +4 -0
  37. data/dev/ci/tests/source-packaging/setup +4 -0
  38. data/dev/ci/tests/standalone/run +4 -0
  39. data/dev/ci/tests/standalone/setup +4 -0
  40. data/dev/copy_boost_headers +8 -2
  41. data/src/agent/Core/ApiServer.h +11 -5
  42. data/src/agent/Core/Controller.h +12 -46
  43. data/src/agent/Core/Controller/CheckoutSession.cpp +1 -1
  44. data/src/agent/Core/Controller/Config.h +369 -0
  45. data/src/agent/Core/Controller/ForwardResponse.cpp +4 -4
  46. data/src/agent/Core/Controller/Hooks.cpp +15 -3
  47. data/src/agent/Core/Controller/Implementation.cpp +1 -1
  48. data/src/agent/Core/Controller/InitRequest.cpp +28 -39
  49. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +25 -60
  50. data/src/agent/Core/Controller/InternalUtils.cpp +0 -16
  51. data/src/agent/Core/Controller/Miscellaneous.cpp +0 -17
  52. data/src/agent/Core/Controller/Request.h +2 -0
  53. data/src/agent/Core/Controller/SendRequest.cpp +4 -4
  54. data/src/agent/Core/Controller/{StateInspectionAndConfiguration.cpp → StateInspection.cpp} +0 -22
  55. data/src/agent/Core/Controller/TurboCaching.h +11 -10
  56. data/src/agent/Core/CoreMain.cpp +16 -6
  57. data/src/agent/Core/ResponseCache.h +3 -3
  58. data/src/agent/Core/SpawningKit/SmartSpawner.h +9 -3
  59. data/src/agent/Core/SpawningKit/Spawner.h +7 -3
  60. data/src/agent/UstRouter/ApiServer.h +3 -2
  61. data/src/agent/UstRouter/Controller.h +66 -32
  62. data/src/agent/UstRouter/UstRouterMain.cpp +10 -2
  63. data/src/agent/Watchdog/ApiServer.h +3 -2
  64. data/src/agent/Watchdog/WatchdogMain.cpp +3 -1
  65. data/src/apache2_module/ConfigurationCommands.cpp +1 -1
  66. data/src/cxx_supportlib/ConfigKit/Common.h +125 -0
  67. data/src/cxx_supportlib/ConfigKit/ConfigKit.h +34 -0
  68. data/src/cxx_supportlib/ConfigKit/README.md +895 -0
  69. data/src/cxx_supportlib/ConfigKit/Schema.h +331 -0
  70. data/src/cxx_supportlib/ConfigKit/Store.h +385 -0
  71. data/src/cxx_supportlib/ConfigKit/TableTranslator.h +185 -0
  72. data/src/cxx_supportlib/ConfigKit/Utils.h +141 -0
  73. data/src/cxx_supportlib/ConfigKit/VariantMapUtils.h +81 -0
  74. data/src/cxx_supportlib/Constants.h +1 -1
  75. data/src/cxx_supportlib/Crypto.cpp +2 -2
  76. data/src/cxx_supportlib/Logging.h +0 -35
  77. data/src/cxx_supportlib/ServerKit/HttpServer.h +35 -16
  78. data/src/cxx_supportlib/ServerKit/Server.h +65 -25
  79. data/src/cxx_supportlib/oxt/macros.hpp +3 -0
  80. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/replace.hpp +0 -2
  81. data/src/cxx_supportlib/vendor-modified/boost/array.hpp +53 -42
  82. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_template.hpp +11 -5
  83. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_cast.hpp +13 -2
  84. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/caps_gcc_x86.hpp +23 -0
  85. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/caps_msvc_x86.hpp +5 -0
  86. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/config.hpp +3 -2
  87. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/interlocked.hpp +8 -1
  88. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_emulated.hpp +3 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_alpha.hpp +2 -0
  90. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_arm.hpp +2 -0
  91. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_atomic.hpp +5 -0
  92. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_ppc.hpp +2 -0
  93. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_sparc.hpp +6 -4
  94. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_sync.hpp +2 -0
  95. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_x86.hpp +3 -1
  96. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_x86_dcas.hpp +28 -17
  97. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_linux_arm.hpp +2 -0
  98. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_msvc_arm.hpp +2 -0
  99. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_msvc_x86.hpp +9 -4
  100. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/platform.hpp +3 -3
  101. data/src/cxx_supportlib/vendor-modified/boost/bind/arg.hpp +10 -3
  102. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +90 -18
  103. data/src/cxx_supportlib/vendor-modified/boost/cerrno.hpp +2 -2
  104. data/src/cxx_supportlib/vendor-modified/boost/chrono/duration.hpp +1 -1
  105. data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +8 -3
  106. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +2 -0
  107. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +35 -6
  108. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +2 -0
  109. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/comeau.hpp +1 -1
  110. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +2 -0
  111. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/compaq_cxx.hpp +1 -1
  112. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +3 -1
  113. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +2 -0
  114. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +19 -4
  115. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +3 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/greenhills.hpp +1 -1
  117. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +3 -1
  118. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +29 -7
  119. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/kai.hpp +1 -1
  120. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +2 -0
  121. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +2 -0
  122. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/nvcc.hpp +16 -0
  123. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +2 -0
  124. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pgi.hpp +2 -0
  125. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sgi_mipspro.hpp +1 -1
  126. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +10 -1
  127. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +2 -0
  128. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +44 -16
  129. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +4 -0
  130. data/src/cxx_supportlib/vendor-modified/boost/config/platform/cygwin.hpp +1 -2
  131. data/src/cxx_supportlib/vendor-modified/boost/config/platform/linux.hpp +1 -1
  132. data/src/cxx_supportlib/vendor-modified/boost/config/select_compiler_config.hpp +21 -21
  133. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +42 -1
  134. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcomo.hpp +7 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +40 -7
  136. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +39 -6
  137. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/modena.hpp +7 -0
  138. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/msl.hpp +7 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/roguewave.hpp +7 -0
  140. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/sgi.hpp +8 -1
  141. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/stlport.hpp +7 -0
  142. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/vacpp.hpp +7 -0
  143. data/src/cxx_supportlib/vendor-modified/boost/config/suffix.hpp +33 -4
  144. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +0 -2
  145. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +0 -3
  146. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +34 -27
  147. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +62 -26
  148. data/src/cxx_supportlib/vendor-modified/boost/container/detail/addressof.hpp +2 -2
  149. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +4 -4
  150. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +4 -4
  151. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +2 -0
  152. data/src/cxx_supportlib/vendor-modified/boost/container/detail/construct_in_place.hpp +39 -5
  153. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +49 -32
  154. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +175 -7
  155. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +223 -98
  156. data/src/cxx_supportlib/vendor-modified/boost/container/detail/is_sorted.hpp +57 -0
  157. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterators.hpp +88 -41
  158. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +7 -8
  159. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +4 -9
  160. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +45 -18
  161. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +205 -26
  162. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +290 -181
  163. data/src/cxx_supportlib/vendor-modified/boost/container/detail/value_init.hpp +2 -0
  164. data/src/cxx_supportlib/vendor-modified/boost/container/detail/variadic_templates_tools.hpp +24 -19
  165. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +38 -0
  166. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +320 -46
  167. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +91 -18
  168. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +23 -19
  169. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +491 -120
  170. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +4 -4
  171. data/src/cxx_supportlib/vendor-modified/boost/container/node_allocator.hpp +0 -3
  172. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +399 -0
  173. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/deque.hpp +2 -0
  174. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/flat_map.hpp +4 -0
  175. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/flat_set.hpp +4 -0
  176. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/list.hpp +2 -0
  177. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/map.hpp +4 -0
  178. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/set.hpp +4 -0
  179. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/slist.hpp +2 -0
  180. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/small_vector.hpp +2 -0
  181. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/stable_vector.hpp +2 -0
  182. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/string.hpp +2 -0
  183. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/vector.hpp +2 -0
  184. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +101 -20
  185. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +19 -14
  186. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +117 -59
  187. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +8 -6
  188. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +33 -28
  189. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +414 -70
  190. data/src/cxx_supportlib/vendor-modified/boost/container/throw_exception.hpp +1 -0
  191. data/src/cxx_supportlib/vendor-modified/boost/container/uses_allocator_fwd.hpp +2 -2
  192. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +134 -117
  193. data/src/cxx_supportlib/vendor-modified/boost/core/addressof.hpp +202 -99
  194. data/src/cxx_supportlib/vendor-modified/boost/core/demangle.hpp +8 -10
  195. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +217 -1
  196. data/src/cxx_supportlib/vendor-modified/boost/core/scoped_enum.hpp +29 -27
  197. data/src/cxx_supportlib/vendor-modified/boost/current_function.hpp +5 -1
  198. data/src/cxx_supportlib/vendor-modified/boost/date_time/c_time.hpp +13 -13
  199. data/src/cxx_supportlib/vendor-modified/boost/date_time/constrained_value.hpp +3 -3
  200. data/src/cxx_supportlib/vendor-modified/boost/date_time/date.hpp +2 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/date_time/date_duration.hpp +4 -3
  202. data/src/cxx_supportlib/vendor-modified/boost/date_time/date_duration_types.hpp +6 -5
  203. data/src/cxx_supportlib/vendor-modified/boost/date_time/date_facet.hpp +2 -2
  204. data/src/cxx_supportlib/vendor-modified/boost/date_time/date_names_put.hpp +8 -7
  205. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_calendar.hpp +2 -1
  206. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_date.hpp +2 -1
  207. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_day.hpp +4 -3
  208. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_day_of_year.hpp +3 -2
  209. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_duration.hpp +2 -1
  210. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_duration_types.hpp +4 -3
  211. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_facet.hpp +27 -7
  212. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_month.hpp +5 -5
  213. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_serialize.hpp +5 -0
  214. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_weekday.hpp +4 -4
  215. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian/greg_year.hpp +4 -5
  216. data/src/cxx_supportlib/vendor-modified/boost/date_time/gregorian_calendar.hpp +2 -1
  217. data/src/cxx_supportlib/vendor-modified/boost/date_time/local_time/local_date_time.hpp +5 -4
  218. data/src/cxx_supportlib/vendor-modified/boost/date_time/local_time/posix_time_zone.hpp +4 -3
  219. data/src/cxx_supportlib/vendor-modified/boost/date_time/period.hpp +3 -2
  220. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/date_duration_operators.hpp +1 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/posix_time_config.hpp +2 -2
  222. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/posix_time_duration.hpp +5 -4
  223. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/ptime.hpp +6 -5
  224. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/time_parsers.hpp +4 -0
  225. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_duration.hpp +2 -2
  226. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_facet.hpp +5 -4
  227. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_zone_base.hpp +2 -1
  228. data/src/cxx_supportlib/vendor-modified/boost/date_time/year_month_day.hpp +3 -1
  229. data/src/cxx_supportlib/vendor-modified/boost/detail/iterator.hpp +13 -0
  230. data/src/cxx_supportlib/vendor-modified/boost/detail/lcast_precision.hpp +1 -0
  231. data/src/cxx_supportlib/vendor-modified/boost/detail/workaround.hpp +5 -0
  232. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/error_info_impl.hpp +11 -0
  233. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/shared_ptr.hpp +17 -0
  234. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +25 -3
  235. data/src/cxx_supportlib/vendor-modified/boost/exception/get_error_info.hpp +2 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/exception/info.hpp +114 -1
  237. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +116 -142
  238. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +57 -69
  239. data/src/cxx_supportlib/vendor-modified/boost/functional/hash/detail/hash_float.hpp +1 -1
  240. data/src/cxx_supportlib/vendor-modified/boost/functional/hash/extensions.hpp +3 -3
  241. data/src/cxx_supportlib/vendor-modified/boost/functional/hash/hash.hpp +27 -13
  242. data/src/cxx_supportlib/vendor-modified/boost/intrusive/any_hook.hpp +4 -2
  243. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avl_set.hpp +99 -12
  244. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avl_set_hook.hpp +4 -2
  245. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree.hpp +35 -4
  246. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree_algorithms.hpp +37 -6
  247. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bs_set.hpp +95 -8
  248. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bs_set_hook.hpp +4 -2
  249. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree.hpp +209 -72
  250. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree_algorithms.hpp +86 -20
  251. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +11 -11
  252. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_slist_algorithms.hpp +6 -6
  253. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/algo_type.hpp +4 -1
  254. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/any_node_and_algorithms.hpp +58 -45
  255. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/avltree_node.hpp +27 -26
  256. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/bstree_algorithms_base.hpp +2 -2
  257. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +7 -7
  258. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/config_begin.hpp +8 -3
  259. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/default_header_holder.hpp +4 -3
  260. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +27 -26
  261. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/equal_to_value.hpp +3 -1
  262. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/exception_disposer.hpp +4 -2
  263. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/generic_hook.hpp +9 -7
  264. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/has_member_function_callable_with.hpp +83 -57
  265. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hashtable_node.hpp +30 -30
  266. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +9 -8
  267. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/iiterator.hpp +8 -7
  268. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/iterator.hpp +16 -15
  269. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/key_nodeptr_comp.hpp +70 -44
  270. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_iterator.hpp +22 -21
  271. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_node.hpp +7 -6
  272. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/parent_from_member.hpp +5 -4
  273. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/rbtree_node.hpp +29 -28
  274. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/reverse_iterator.hpp +33 -12
  275. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/size_holder.hpp +19 -12
  276. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +21 -20
  277. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_node.hpp +4 -3
  278. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/to_raw_pointer.hpp +3 -2
  279. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/transform_iterator.hpp +23 -22
  280. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_iterator.hpp +23 -22
  281. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_node.hpp +10 -9
  282. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_value_compare.hpp +103 -29
  283. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +15 -0
  284. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +295 -211
  285. data/src/cxx_supportlib/vendor-modified/boost/intrusive/linear_slist_algorithms.hpp +2 -2
  286. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +20 -7
  287. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list_hook.hpp +4 -2
  288. data/src/cxx_supportlib/vendor-modified/boost/intrusive/member_value_traits.hpp +5 -4
  289. data/src/cxx_supportlib/vendor-modified/boost/intrusive/options.hpp +4 -4
  290. data/src/cxx_supportlib/vendor-modified/boost/intrusive/parent_from_member.hpp +3 -2
  291. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_plus_bits.hpp +4 -4
  292. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_traits.hpp +4 -4
  293. data/src/cxx_supportlib/vendor-modified/boost/intrusive/priority_compare.hpp +22 -4
  294. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree.hpp +36 -4
  295. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +43 -13
  296. data/src/cxx_supportlib/vendor-modified/boost/intrusive/set.hpp +95 -8
  297. data/src/cxx_supportlib/vendor-modified/boost/intrusive/set_hook.hpp +4 -2
  298. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sg_set.hpp +96 -12
  299. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree.hpp +102 -5
  300. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree_algorithms.hpp +48 -4
  301. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +20 -11
  302. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist_hook.hpp +9 -2
  303. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splay_set.hpp +95 -8
  304. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree.hpp +36 -4
  305. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree_algorithms.hpp +27 -0
  306. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap.hpp +167 -23
  307. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_algorithms.hpp +28 -0
  308. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_set.hpp +100 -46
  309. data/src/cxx_supportlib/vendor-modified/boost/intrusive/trivial_value_traits.hpp +5 -4
  310. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +37 -27
  311. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set_hook.hpp +30 -14
  312. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +1 -1
  313. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +35 -36
  314. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +6 -28
  315. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +20 -5
  316. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/posix_api.cpp +4 -2
  317. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex.cpp +3 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/once.cpp +5 -0
  319. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +11 -7
  320. data/src/cxx_supportlib/vendor-modified/boost/math/policies/policy.hpp +1 -3
  321. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/fpclassify.hpp +5 -1
  322. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/math_fwd.hpp +11 -0
  323. data/src/cxx_supportlib/vendor-modified/boost/math/tools/config.hpp +10 -2
  324. data/src/cxx_supportlib/vendor-modified/boost/move/adl_move_swap.hpp +40 -7
  325. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +67 -0
  326. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +63 -0
  327. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +2437 -0
  328. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/basic_op.hpp +121 -0
  329. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/insertion_sort.hpp +127 -0
  330. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/merge.hpp +637 -0
  331. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/merge_sort.hpp +139 -0
  332. data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +155 -0
  333. data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +1 -116
  334. data/src/cxx_supportlib/vendor-modified/boost/move/core.hpp +14 -13
  335. data/src/cxx_supportlib/vendor-modified/boost/move/default_delete.hpp +17 -1
  336. data/src/cxx_supportlib/vendor-modified/boost/move/detail/config_begin.hpp +2 -0
  337. data/src/cxx_supportlib/vendor-modified/boost/move/detail/destruct_n.hpp +67 -0
  338. data/src/cxx_supportlib/vendor-modified/boost/move/detail/fwd_macros.hpp +227 -32
  339. data/src/cxx_supportlib/vendor-modified/boost/move/detail/iterator_traits.hpp +4 -0
  340. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +30 -9
  341. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils_core.hpp +12 -0
  342. data/src/cxx_supportlib/vendor-modified/boost/move/detail/move_helpers.hpp +84 -80
  343. data/src/cxx_supportlib/vendor-modified/boost/move/detail/placement_new.hpp +30 -0
  344. data/src/cxx_supportlib/vendor-modified/boost/move/detail/reverse_iterator.hpp +171 -0
  345. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +14 -20
  346. data/src/cxx_supportlib/vendor-modified/boost/move/detail/unique_ptr_meta_utils.hpp +1 -1
  347. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +14 -0
  348. data/src/cxx_supportlib/vendor-modified/boost/move/iterator.hpp +32 -33
  349. data/src/cxx_supportlib/vendor-modified/boost/move/make_unique.hpp +2 -1
  350. data/src/cxx_supportlib/vendor-modified/boost/move/unique_ptr.hpp +49 -49
  351. data/src/cxx_supportlib/vendor-modified/boost/move/utility.hpp +8 -7
  352. data/src/cxx_supportlib/vendor-modified/boost/move/utility_core.hpp +17 -16
  353. data/src/cxx_supportlib/vendor-modified/boost/mpl/print.hpp +3 -0
  354. data/src/cxx_supportlib/vendor-modified/boost/none.hpp +1 -1
  355. data/src/cxx_supportlib/vendor-modified/boost/none_t.hpp +2 -3
  356. data/src/cxx_supportlib/vendor-modified/boost/operators.hpp +197 -255
  357. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +1059 -0
  358. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_aligned_storage.hpp +75 -0
  359. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_config.hpp +116 -0
  360. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_factory_support.hpp +36 -0
  361. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +253 -0
  362. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +196 -0
  363. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_swap.hpp +117 -0
  364. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +372 -554
  365. data/src/cxx_supportlib/vendor-modified/boost/optional/optional_fwd.hpp +12 -1
  366. data/src/cxx_supportlib/vendor-modified/boost/pool/detail/mutex.hpp +15 -7
  367. data/src/cxx_supportlib/vendor-modified/boost/pool/pool_alloc.hpp +24 -0
  368. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/intel.h +9 -2
  369. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/visualc.h +15 -1
  370. data/src/cxx_supportlib/vendor-modified/boost/predef/hardware/simd.h +16 -4
  371. data/src/cxx_supportlib/vendor-modified/boost/predef/hardware/simd/x86.h +3 -3
  372. data/src/cxx_supportlib/vendor-modified/boost/predef/hardware/simd/x86_amd.h +4 -4
  373. data/src/cxx_supportlib/vendor-modified/boost/predef/hardware/simd/x86_amd/versions.h +4 -4
  374. data/src/cxx_supportlib/vendor-modified/boost/predef/os/cygwin.h +1 -1
  375. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +2 -2
  376. data/src/cxx_supportlib/vendor-modified/boost/predef/version_number.h +20 -1
  377. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/cat.hpp +1 -1
  378. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/config/config.hpp +6 -6
  379. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/binary_transform.hpp +5 -6
  380. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/detail/to_list_msvc.hpp +55 -0
  381. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/seq/to_list.hpp +12 -0
  382. data/src/cxx_supportlib/vendor-modified/boost/range/const_iterator.hpp +4 -4
  383. data/src/cxx_supportlib/vendor-modified/boost/range/size_type.hpp +0 -5
  384. data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +16 -16
  385. data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +4 -4
  386. data/src/cxx_supportlib/vendor-modified/boost/regex/pending/unicode_iterator.hpp +3 -0
  387. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +102 -87
  388. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +45 -21
  389. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cpp_regex_traits.hpp +4 -4
  390. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/fileiter.hpp +2 -2
  391. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/instances.hpp +1 -1
  392. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +14 -2
  393. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/mem_block_cache.hpp +46 -0
  394. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +5 -2
  395. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +5 -14
  396. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +116 -13
  397. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_recursive.hpp +34 -0
  398. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +2 -2
  399. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits.hpp +1 -1
  400. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +3 -3
  401. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +1 -0
  402. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +2 -2
  403. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +1004 -159
  404. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/bad_weak_ptr.hpp +9 -0
  405. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count.hpp +3 -0
  406. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/shared_count.hpp +4 -58
  407. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base.hpp +5 -2
  408. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_clang.hpp +9 -0
  409. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +0 -8
  410. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_sync.hpp +3 -3
  411. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_noexcept.hpp +30 -0
  412. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock.hpp +3 -0
  413. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/enable_shared_from_this.hpp +5 -4
  414. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ptr.hpp +28 -3
  415. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ref_counter.hpp +187 -0
  416. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_array.hpp +52 -144
  417. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_object.hpp +120 -450
  418. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_array.hpp +2 -1
  419. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_ptr.hpp +2 -1
  420. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_array.hpp +7 -6
  421. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_ptr.hpp +70 -8
  422. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/weak_ptr.hpp +6 -5
  423. data/src/cxx_supportlib/vendor-modified/boost/system/error_code.hpp +9 -8
  424. data/src/cxx_supportlib/vendor-modified/boost/system/system_error.hpp +3 -3
  425. data/src/cxx_supportlib/vendor-modified/boost/thread/barrier.hpp +5 -4
  426. data/src/cxx_supportlib/vendor-modified/boost/thread/completion_latch.hpp +0 -1
  427. data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/queue_views.hpp +0 -11
  428. data/src/cxx_supportlib/vendor-modified/boost/thread/concurrent_queues/sync_timed_queue.hpp +6 -4
  429. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/config.hpp +11 -2
  430. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +11 -4
  431. data/src/cxx_supportlib/vendor-modified/boost/thread/exceptions.hpp +8 -8
  432. data/src/cxx_supportlib/vendor-modified/boost/thread/executors/executor.hpp +1 -1
  433. data/src/cxx_supportlib/vendor-modified/boost/thread/executors/generic_executor_ref.hpp +5 -5
  434. data/src/cxx_supportlib/vendor-modified/boost/thread/executors/loop_executor.hpp +22 -18
  435. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +163 -55
  436. data/src/cxx_supportlib/vendor-modified/boost/thread/futures/launch.hpp +1 -0
  437. data/src/cxx_supportlib/vendor-modified/boost/thread/futures/wait_for_all.hpp +1 -1
  438. data/src/cxx_supportlib/vendor-modified/boost/thread/lock_types.hpp +9 -9
  439. data/src/cxx_supportlib/vendor-modified/boost/thread/locks.hpp +1 -0
  440. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable.hpp +6 -7
  441. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable_fwd.hpp +17 -2
  442. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/shared_mutex.hpp +2 -2
  443. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/thread_data.hpp +5 -5
  444. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/timespec.hpp +29 -0
  445. data/src/cxx_supportlib/vendor-modified/boost/thread/scoped_thread.hpp +23 -18
  446. data/src/cxx_supportlib/vendor-modified/boost/thread/synchronized_value.hpp +6 -6
  447. data/src/cxx_supportlib/vendor-modified/boost/thread/thread_functors.hpp +19 -4
  448. data/src/cxx_supportlib/vendor-modified/boost/thread/thread_guard.hpp +3 -3
  449. data/src/cxx_supportlib/vendor-modified/boost/thread/user_scheduler.hpp +1 -1
  450. data/src/cxx_supportlib/vendor-modified/boost/type_index.hpp +265 -0
  451. data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +272 -0
  452. data/src/cxx_supportlib/vendor-modified/boost/type_index/type_index_facade.hpp +300 -0
  453. data/src/cxx_supportlib/vendor-modified/boost/type_traits/add_reference.hpp +3 -3
  454. data/src/cxx_supportlib/vendor-modified/boost/type_traits/aligned_storage.hpp +6 -6
  455. data/src/cxx_supportlib/vendor-modified/boost/type_traits/common_type.hpp +1 -0
  456. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/common_arithmetic_type.hpp +9 -3
  457. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/mp_defer.hpp +3 -3
  458. data/src/cxx_supportlib/vendor-modified/boost/type_traits/extent.hpp +1 -0
  459. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_nothrow_assign.hpp +2 -1
  460. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_nothrow_constructor.hpp +2 -1
  461. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_nothrow_destructor.hpp +1 -1
  462. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_assign.hpp +2 -1
  463. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_copy.hpp +1 -0
  464. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_destructor.hpp +1 -1
  465. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_assign.hpp +1 -0
  466. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_constructor.hpp +1 -0
  467. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_abstract.hpp +1 -0
  468. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_array.hpp +1 -1
  469. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_assignable.hpp +1 -0
  470. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_const.hpp +2 -1
  471. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_default_constructible.hpp +21 -1
  472. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_destructible.hpp +1 -0
  473. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_assignable.hpp +1 -1
  474. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_constructible.hpp +2 -1
  475. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_pod.hpp +1 -0
  476. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_rvalue_reference.hpp +1 -1
  477. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_virtual_base_of.hpp +1 -1
  478. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_volatile.hpp +2 -1
  479. data/src/cxx_supportlib/vendor-modified/boost/type_traits/make_void.hpp +52 -0
  480. data/src/cxx_supportlib/vendor-modified/boost/type_traits/rank.hpp +1 -0
  481. data/src/cxx_supportlib/vendor-modified/boost/type_traits/remove_all_extents.hpp +1 -1
  482. data/src/cxx_supportlib/vendor-modified/boost/type_traits/remove_const.hpp +1 -1
  483. data/src/cxx_supportlib/vendor-modified/boost/type_traits/remove_cv.hpp +1 -1
  484. data/src/cxx_supportlib/vendor-modified/boost/type_traits/remove_extent.hpp +1 -1
  485. data/src/cxx_supportlib/vendor-modified/boost/type_traits/remove_pointer.hpp +1 -1
  486. data/src/cxx_supportlib/vendor-modified/boost/type_traits/remove_volatile.hpp +1 -1
  487. data/src/cxx_supportlib/vendor-modified/boost/type_traits/type_with_alignment.hpp +1 -1
  488. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fwd.hpp +40 -6
  489. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +4986 -0
  490. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/map.hpp +107 -0
  491. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/set.hpp +105 -0
  492. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +1814 -1255
  493. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +41 -45
  494. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +1498 -1161
  495. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +40 -44
  496. data/src/cxx_supportlib/vendor-modified/boost/utility.hpp +2 -2
  497. data/src/cxx_supportlib/vendor-modified/boost/utility/base_from_member.hpp +7 -6
  498. data/src/cxx_supportlib/vendor-modified/boost/utility/compare_pointees.hpp +10 -2
  499. data/src/cxx_supportlib/vendor-modified/boost/utility/string_ref.hpp +39 -22
  500. data/src/cxx_supportlib/vendor-modified/boost/utility/string_view.hpp +690 -0
  501. data/src/cxx_supportlib/vendor-modified/boost/utility/string_view_fwd.hpp +39 -0
  502. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  503. data/src/helper-scripts/crash-watch.rb +3 -0
  504. data/src/ruby_supportlib/phusion_passenger.rb +1 -1
  505. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +1 -0
  506. data/src/ruby_supportlib/phusion_passenger/packaging.rb +2 -12
  507. metadata +77 -38
  508. data/dev/ci/inituidgid +0 -24
  509. data/dev/ci/run_jenkins.sh +0 -70
  510. data/dev/ci/run_travis.sh +0 -314
  511. data/doc/Design and Architecture.html +0 -2421
  512. data/doc/Design and Architecture.txt +0 -511
  513. data/doc/Security of user switching support.html +0 -1833
  514. data/doc/Users guide Apache.html +0 -3101
  515. data/doc/Users guide Apache.idmap.txt +0 -451
  516. data/doc/Users guide Apache.txt +0 -534
  517. data/doc/Users guide Nginx.html +0 -3026
  518. data/doc/Users guide Nginx.idmap.txt +0 -431
  519. data/doc/Users guide Nginx.txt +0 -451
  520. data/doc/Users guide Standalone.html +0 -2092
  521. data/doc/Users guide Standalone.idmap.txt +0 -137
  522. data/doc/Users guide Standalone.txt +0 -81
  523. data/doc/Users guide.html +0 -1606
  524. data/doc/Users guide.txt +0 -8
  525. data/src/cxx_supportlib/vendor-modified/boost/align/align.hpp +0 -20
  526. data/src/cxx_supportlib/vendor-modified/boost/align/detail/address.hpp +0 -29
  527. data/src/cxx_supportlib/vendor-modified/boost/align/detail/align.hpp +0 -40
  528. data/src/cxx_supportlib/vendor-modified/boost/align/detail/align_cxx11.hpp +0 -22
  529. data/src/cxx_supportlib/vendor-modified/boost/align/detail/is_alignment.hpp +0 -29
  530. data/src/cxx_supportlib/vendor-modified/boost/container/detail/hash_table.hpp +0 -383
  531. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/array_allocator.hpp +0 -318
  532. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/array_count_impl.hpp +0 -67
  533. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/array_traits.hpp +0 -60
  534. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/array_utility.hpp +0 -214
  535. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_if_array.hpp +0 -34
  536. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/allocate.hpp +0 -1128
  537. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/buckets.hpp +0 -928
  538. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/equivalent.hpp +0 -686
  539. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/extract_key.hpp +0 -188
  540. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/table.hpp +0 -873
  541. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/unique.hpp +0 -628
  542. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/util.hpp +0 -266
@@ -22,6 +22,7 @@
22
22
  #endif
23
23
 
24
24
  #include <boost/intrusive/detail/config_begin.hpp>
25
+ #include <boost/intrusive/detail/workaround.hpp>
25
26
  #include <boost/intrusive/detail/std_fwd.hpp>
26
27
  #include <boost/intrusive/detail/iiterator.hpp>
27
28
  #include <boost/intrusive/detail/bstree_algorithms_base.hpp>
@@ -56,27 +57,27 @@ class tree_iterator
56
57
  typedef void (tree_iterator::*unspecified_bool_type)() const;
57
58
 
58
59
  public:
59
- typedef typename types_t::iterator_traits::difference_type difference_type;
60
- typedef typename types_t::iterator_traits::value_type value_type;
61
- typedef typename types_t::iterator_traits::pointer pointer;
62
- typedef typename types_t::iterator_traits::reference reference;
63
- typedef typename types_t::iterator_traits::iterator_category iterator_category;
60
+ typedef typename types_t::iterator_type::difference_type difference_type;
61
+ typedef typename types_t::iterator_type::value_type value_type;
62
+ typedef typename types_t::iterator_type::pointer pointer;
63
+ typedef typename types_t::iterator_type::reference reference;
64
+ typedef typename types_t::iterator_type::iterator_category iterator_category;
64
65
 
65
- tree_iterator()
66
+ BOOST_INTRUSIVE_FORCEINLINE tree_iterator()
66
67
  {}
67
68
 
68
- explicit tree_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr)
69
+ BOOST_INTRUSIVE_FORCEINLINE explicit tree_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr)
69
70
  : members_(nodeptr, traits_ptr)
70
71
  {}
71
72
 
72
- tree_iterator(tree_iterator<value_traits, false> const& other)
73
+ BOOST_INTRUSIVE_FORCEINLINE tree_iterator(tree_iterator<value_traits, false> const& other)
73
74
  : members_(other.pointed_node(), other.get_value_traits())
74
75
  {}
75
76
 
76
- const node_ptr &pointed_node() const
77
+ BOOST_INTRUSIVE_FORCEINLINE const node_ptr &pointed_node() const
77
78
  { return members_.nodeptr_; }
78
79
 
79
- tree_iterator &operator=(const node_ptr &nodeptr)
80
+ BOOST_INTRUSIVE_FORCEINLINE tree_iterator &operator=(const node_ptr &nodeptr)
80
81
  { members_.nodeptr_ = nodeptr; return static_cast<tree_iterator&>(*this); }
81
82
 
82
83
  public:
@@ -106,43 +107,43 @@ class tree_iterator
106
107
  return result;
107
108
  }
108
109
 
109
- tree_iterator& go_left()
110
+ BOOST_INTRUSIVE_FORCEINLINE tree_iterator& go_left()
110
111
  {
111
112
  members_.nodeptr_ = node_traits::get_left(members_.nodeptr_);
112
113
  return static_cast<tree_iterator&> (*this);
113
114
  }
114
115
 
115
- tree_iterator& go_right()
116
+ BOOST_INTRUSIVE_FORCEINLINE tree_iterator& go_right()
116
117
  {
117
118
  members_.nodeptr_ = node_traits::get_right(members_.nodeptr_);
118
119
  return static_cast<tree_iterator&> (*this);
119
120
  }
120
121
 
121
- tree_iterator& go_parent()
122
+ BOOST_INTRUSIVE_FORCEINLINE tree_iterator& go_parent()
122
123
  {
123
124
  members_.nodeptr_ = node_traits::get_parent(members_.nodeptr_);
124
125
  return static_cast<tree_iterator&> (*this);
125
126
  }
126
127
 
127
- operator unspecified_bool_type() const
128
+ BOOST_INTRUSIVE_FORCEINLINE operator unspecified_bool_type() const
128
129
  { return members_.nodeptr_ ? &tree_iterator::unspecified_bool_type_func : 0; }
129
130
 
130
- bool operator! () const
131
+ BOOST_INTRUSIVE_FORCEINLINE bool operator! () const
131
132
  { return !members_.nodeptr_; }
132
133
 
133
- friend bool operator== (const tree_iterator& l, const tree_iterator& r)
134
+ BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const tree_iterator& l, const tree_iterator& r)
134
135
  { return l.pointed_node() == r.pointed_node(); }
135
136
 
136
- friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
137
+ BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
137
138
  { return !(l == r); }
138
139
 
139
- reference operator*() const
140
+ BOOST_INTRUSIVE_FORCEINLINE reference operator*() const
140
141
  { return *operator->(); }
141
142
 
142
- pointer operator->() const
143
+ BOOST_INTRUSIVE_FORCEINLINE pointer operator->() const
143
144
  { return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
144
145
 
145
- const_value_traits_ptr get_value_traits() const
146
+ BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr get_value_traits() const
146
147
  { return members_.get_ptr(); }
147
148
 
148
149
  tree_iterator end_iterator_from_it() const
@@ -154,10 +155,10 @@ class tree_iterator
154
155
  { return tree_iterator<value_traits, false>(this->pointed_node(), this->get_value_traits()); }
155
156
 
156
157
  private:
157
- pointer operator_arrow(detail::false_) const
158
+ BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::false_) const
158
159
  { return ValueTraits::to_value_ptr(members_.nodeptr_); }
159
160
 
160
- pointer operator_arrow(detail::true_) const
161
+ BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::true_) const
161
162
  { return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
162
163
 
163
164
  iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
@@ -22,6 +22,7 @@
22
22
  #endif
23
23
 
24
24
  #include <boost/intrusive/detail/config_begin.hpp>
25
+ #include <boost/intrusive/detail/workaround.hpp>
25
26
  #include <boost/intrusive/pointer_rebind.hpp>
26
27
 
27
28
  namespace boost {
@@ -43,31 +44,31 @@ struct tree_node_traits
43
44
  typedef typename node::node_ptr node_ptr;
44
45
  typedef typename pointer_rebind<VoidPointer, const node>::type const_node_ptr;
45
46
 
46
- static node_ptr get_parent(const const_node_ptr & n)
47
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const const_node_ptr & n)
47
48
  { return n->parent_; }
48
49
 
49
- static node_ptr get_parent(const node_ptr & n)
50
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const node_ptr & n)
50
51
  { return n->parent_; }
51
52
 
52
- static void set_parent(const node_ptr & n, const node_ptr & p)
53
+ BOOST_INTRUSIVE_FORCEINLINE static void set_parent(const node_ptr & n, const node_ptr & p)
53
54
  { n->parent_ = p; }
54
55
 
55
- static node_ptr get_left(const const_node_ptr & n)
56
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const const_node_ptr & n)
56
57
  { return n->left_; }
57
58
 
58
- static node_ptr get_left(const node_ptr & n)
59
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const node_ptr & n)
59
60
  { return n->left_; }
60
61
 
61
- static void set_left(const node_ptr & n, const node_ptr & l)
62
+ BOOST_INTRUSIVE_FORCEINLINE static void set_left(const node_ptr & n, const node_ptr & l)
62
63
  { n->left_ = l; }
63
64
 
64
- static node_ptr get_right(const const_node_ptr & n)
65
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const const_node_ptr & n)
65
66
  { return n->right_; }
66
67
 
67
- static node_ptr get_right(const node_ptr & n)
68
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const node_ptr & n)
68
69
  { return n->right_; }
69
70
 
70
- static void set_right(const node_ptr & n, const node_ptr & r)
71
+ BOOST_INTRUSIVE_FORCEINLINE static void set_right(const node_ptr & n, const node_ptr & r)
71
72
  { n->right_ = r; }
72
73
  };
73
74
 
@@ -18,69 +18,143 @@
18
18
  # pragma once
19
19
  #endif
20
20
 
21
+ #include <boost/intrusive/detail/workaround.hpp>
21
22
  #include <boost/intrusive/detail/mpl.hpp>
22
23
  #include <boost/intrusive/detail/ebo_functor_holder.hpp>
24
+ #include <boost/intrusive/pointer_traits.hpp>
23
25
 
24
26
  namespace boost{
25
27
  namespace intrusive{
26
28
 
27
- template<class Key, class T, class KeyCompare, class KeyOfValue>
29
+ //Needed to support smart references to value types
30
+ template <class From, class ValuePtr>
31
+ struct disable_if_smartref_to
32
+ : detail::disable_if_c
33
+ < detail::is_same
34
+ <From, typename pointer_traits
35
+ <ValuePtr>
36
+ ::reference>::value
37
+ || detail::is_same
38
+ <From, typename pointer_traits
39
+ < typename pointer_rebind
40
+ <ValuePtr, const typename pointer_element<ValuePtr>::type>::type>
41
+ ::reference>::value
42
+ >
43
+ {};
44
+
45
+ //This function object takes a KeyCompare function object
46
+ //and compares values that contains keys using KeyOfValue
47
+ template< class ValuePtr, class KeyCompare, class KeyOfValue
48
+ , bool = boost::intrusive::detail::is_same<typename pointer_element<ValuePtr>::type, typename KeyOfValue::type>::value >
28
49
  struct tree_value_compare
29
50
  : public boost::intrusive::detail::ebo_functor_holder<KeyCompare>
30
51
  {
31
- typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t;
32
- typedef T value_type;
33
- typedef KeyCompare key_compare;
34
- typedef KeyOfValue key_of_value;
35
- typedef Key key_type;
52
+ typedef typename pointer_element<ValuePtr>::type value_type;
53
+ typedef KeyCompare key_compare;
54
+ typedef KeyOfValue key_of_value;
55
+ typedef typename KeyOfValue::type key_type;
36
56
 
57
+ typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t;
37
58
 
38
- tree_value_compare()
59
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare()
39
60
  : base_t()
40
61
  {}
41
62
 
42
- explicit tree_value_compare(const key_compare &kcomp)
63
+ BOOST_INTRUSIVE_FORCEINLINE explicit tree_value_compare(const key_compare &kcomp)
43
64
  : base_t(kcomp)
44
65
  {}
45
66
 
46
- tree_value_compare (const tree_value_compare &x)
67
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare (const tree_value_compare &x)
47
68
  : base_t(x.base_t::get())
48
69
  {}
49
70
 
50
- tree_value_compare &operator=(const tree_value_compare &x)
71
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const tree_value_compare &x)
51
72
  { this->base_t::get() = x.base_t::get(); return *this; }
52
73
 
53
- tree_value_compare &operator=(const key_compare &x)
74
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const key_compare &x)
54
75
  { this->base_t::get() = x; return *this; }
55
76
 
56
- const key_compare &key_comp() const
77
+ BOOST_INTRUSIVE_FORCEINLINE const key_compare &key_comp() const
57
78
  { return static_cast<const key_compare &>(*this); }
58
79
 
59
- key_compare &key_comp()
60
- { return static_cast<key_compare &>(*this); }
80
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()(const key_type &key1, const key_type &key2) const
81
+ { return this->key_comp()(key1, key2); }
82
+
83
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()(const value_type &value1, const value_type &value2) const
84
+ { return this->key_comp()(KeyOfValue()(value1), KeyOfValue()(value2)); }
85
+
86
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()(const key_type &key1, const value_type &value2) const
87
+ { return this->key_comp()(key1, KeyOfValue()(value2)); }
88
+
89
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()(const value_type &value1, const key_type &key2) const
90
+ { return this->key_comp()(KeyOfValue()(value1), key2); }
91
+
92
+ template<class U>
93
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()( const key_type &key1, const U &nonkey2
94
+ , typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
95
+ { return this->key_comp()(key1, nonkey2); }
61
96
 
62
97
  template<class U>
63
- struct is_key
64
- : boost::intrusive::detail::is_same<const U, const key_type>
65
- {};
98
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()( const U &nonkey1, const key_type &key2
99
+ , typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
100
+ { return this->key_comp()(nonkey1, key2); }
66
101
 
67
102
  template<class U>
68
- const key_type & key_forward
69
- (const U &key, typename boost::intrusive::detail::enable_if<is_key<U> >::type* = 0) const
70
- { return key; }
103
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()( const value_type &value1, const U &nonvalue2
104
+ , typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
105
+ { return this->key_comp()(KeyOfValue()(value1), nonvalue2); }
71
106
 
72
107
  template<class U>
73
- const key_type & key_forward
74
- (const U &key, typename boost::intrusive::detail::disable_if<is_key<U> >::type* = 0) const
75
- { return KeyOfValue()(key); }
108
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()( const U &nonvalue1, const value_type &value2
109
+ , typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
110
+ { return this->key_comp()(nonvalue1, KeyOfValue()(value2)); }
111
+ };
112
+
113
+ template<class ValuePtr, class KeyCompare, class KeyOfValue>
114
+ struct tree_value_compare<ValuePtr, KeyCompare, KeyOfValue, true>
115
+ : public boost::intrusive::detail::ebo_functor_holder<KeyCompare>
116
+ {
117
+ typedef typename pointer_element<ValuePtr>::type value_type;
118
+ typedef KeyCompare key_compare;
119
+ typedef KeyOfValue key_of_value;
120
+ typedef typename KeyOfValue::type key_type;
121
+
122
+ typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t;
123
+
124
+
125
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare()
126
+ : base_t()
127
+ {}
128
+
129
+ BOOST_INTRUSIVE_FORCEINLINE explicit tree_value_compare(const key_compare &kcomp)
130
+ : base_t(kcomp)
131
+ {}
132
+
133
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare (const tree_value_compare &x)
134
+ : base_t(x.base_t::get())
135
+ {}
136
+
137
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const tree_value_compare &x)
138
+ { this->base_t::get() = x.base_t::get(); return *this; }
139
+
140
+ BOOST_INTRUSIVE_FORCEINLINE tree_value_compare &operator=(const key_compare &x)
141
+ { this->base_t::get() = x; return *this; }
142
+
143
+ BOOST_INTRUSIVE_FORCEINLINE const key_compare &key_comp() const
144
+ { return static_cast<const key_compare &>(*this); }
145
+
146
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()(const key_type &key1, const key_type &key2) const
147
+ { return this->key_comp()(key1, key2); }
76
148
 
77
- template<class KeyType, class KeyType2>
78
- bool operator()(const KeyType &key1, const KeyType2 &key2) const
79
- { return key_compare::operator()(this->key_forward(key1), this->key_forward(key2)); }
149
+ template<class U>
150
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()( const key_type &key1, const U &nonkey2
151
+ , typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
152
+ { return this->key_comp()(key1, nonkey2); }
80
153
 
81
- template<class KeyType, class KeyType2>
82
- bool operator()(const KeyType &key1, const KeyType2 &key2)
83
- { return key_compare::operator()(this->key_forward(key1), this->key_forward(key2)); }
154
+ template<class U>
155
+ BOOST_INTRUSIVE_FORCEINLINE bool operator()(const U &nonkey1, const key_type &key2
156
+ , typename disable_if_smartref_to<U, ValuePtr>::type* = 0) const
157
+ { return this->key_comp()(nonkey1, key2); }
84
158
  };
85
159
 
86
160
  } //namespace intrusive{
@@ -34,5 +34,20 @@
34
34
  #define BOOST_INTRUSIVE_I ,
35
35
  #define BOOST_INTRUSIVE_DOCIGN(T1) T1
36
36
 
37
+ #define BOOST_INTRUSIVE_DISABLE_FORCEINLINE
38
+
39
+ #if defined(BOOST_INTRUSIVE_DISABLE_FORCEINLINE)
40
+ #define BOOST_INTRUSIVE_FORCEINLINE inline
41
+ #elif defined(BOOST_INTRUSIVE_FORCEINLINE_IS_BOOST_FORCELINE)
42
+ #define BOOST_INTRUSIVE_FORCEINLINE BOOST_FORCEINLINE
43
+ #elif defined(BOOST_MSVC) && defined(_DEBUG)
44
+ //"__forceinline" and MSVC seems to have some bugs in debug mode
45
+ #define BOOST_INTRUSIVE_FORCEINLINE inline
46
+ #elif defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ < 5)))
47
+ //Older GCCs have problems with forceinline
48
+ #define BOOST_INTRUSIVE_FORCEINLINE inline
49
+ #else
50
+ #define BOOST_INTRUSIVE_FORCEINLINE BOOST_FORCEINLINE
51
+ #endif
37
52
 
38
53
  #endif //#ifndef BOOST_INTRUSIVE_DETAIL_WORKAROUND_HPP
@@ -119,6 +119,8 @@ struct prime_list_holder
119
119
  static const std::size_t prime_list_size;
120
120
  };
121
121
 
122
+ #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
123
+
122
124
  //We only support LLP64(Win64) or LP64(most Unix) data models
123
125
  #ifdef _WIN64 //In 64 bit windows sizeof(size_t) == sizeof(unsigned long long)
124
126
  #define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##ULL
@@ -173,6 +175,8 @@ const std::size_t prime_list_holder<Dummy>::prime_list[] = {
173
175
  #undef BOOST_INTRUSIVE_PRIME_C
174
176
  #undef BOOST_INTRUSIVE_64_BIT_SIZE_T
175
177
 
178
+ #endif //#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
179
+
176
180
  template<int Dummy>
177
181
  const std::size_t prime_list_holder<Dummy>::prime_list_size
178
182
  = sizeof(prime_list)/sizeof(std::size_t);
@@ -251,7 +255,7 @@ struct insert_commit_data_impl
251
255
  };
252
256
 
253
257
  template<class Node, class SlistNodePtr>
254
- inline typename pointer_traits<SlistNodePtr>::template rebind_pointer<Node>::type
258
+ BOOST_INTRUSIVE_FORCEINLINE typename pointer_traits<SlistNodePtr>::template rebind_pointer<Node>::type
255
259
  dcast_bucket_ptr(const SlistNodePtr &p)
256
260
  {
257
261
  typedef typename pointer_traits<SlistNodePtr>::template rebind_pointer<Node>::type node_ptr;
@@ -341,13 +345,13 @@ struct group_functions
341
345
  }
342
346
  }
343
347
 
344
- static void erase_from_group(const slist_node_ptr&, const node_ptr&, detail::false_)
348
+ BOOST_INTRUSIVE_FORCEINLINE static void erase_from_group(const slist_node_ptr&, const node_ptr&, detail::false_)
345
349
  {}
346
350
 
347
- static node_ptr get_last_in_group(const node_ptr &first_in_group, detail::true_)
351
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_in_group(const node_ptr &first_in_group, detail::true_)
348
352
  { return group_traits::get_next(first_in_group); }
349
353
 
350
- static node_ptr get_last_in_group(node_ptr n, detail::false_)
354
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_in_group(node_ptr n, detail::false_)
351
355
  { return n; }
352
356
 
353
357
  static node_ptr get_first_in_group(node_ptr n, detail::true_)
@@ -359,21 +363,21 @@ struct group_functions
359
363
  return n;
360
364
  }
361
365
 
362
- static node_ptr next_group_if_first_in_group(node_ptr ptr)
366
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr next_group_if_first_in_group(node_ptr ptr)
363
367
  {
364
368
  return node_traits::get_next(group_traits::get_next(ptr));
365
369
  }
366
370
 
367
- static node_ptr get_first_in_group(const node_ptr &n, detail::false_)
371
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_first_in_group(const node_ptr &n, detail::false_)
368
372
  { return n; }
369
373
 
370
- static void insert_in_group(const node_ptr &first_in_group, const node_ptr &n, true_)
374
+ BOOST_INTRUSIVE_FORCEINLINE static void insert_in_group(const node_ptr &first_in_group, const node_ptr &n, true_)
371
375
  { group_algorithms::link_after(first_in_group, n); }
372
376
 
373
377
  static void insert_in_group(const node_ptr&, const node_ptr&, false_)
374
378
  {}
375
379
 
376
- static node_ptr split_group(node_ptr const new_first_in_group)
380
+ BOOST_INTRUSIVE_FORCEINLINE static node_ptr split_group(node_ptr const new_first_in_group)
377
381
  {
378
382
  node_ptr const first((get_first_in_group)(new_first_in_group, detail::true_()));
379
383
  if(first != new_first_in_group){
@@ -403,7 +407,7 @@ class incremental_rehash_rollback
403
407
  , split_traits_(split_traits), released_(false)
404
408
  {}
405
409
 
406
- void release()
410
+ BOOST_INTRUSIVE_FORCEINLINE void release()
407
411
  { released_ = true; }
408
412
 
409
413
  ~incremental_rehash_rollback()
@@ -426,21 +430,21 @@ class incremental_rehash_rollback
426
430
  template<class NodeTraits>
427
431
  struct node_functions
428
432
  {
429
- static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, true_)
433
+ BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, true_)
430
434
  { return NodeTraits::set_hash(p, h); }
431
435
 
432
- static void store_hash(typename NodeTraits::node_ptr, std::size_t, false_)
436
+ BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr, std::size_t, false_)
433
437
  {}
434
438
  };
435
439
 
436
- inline std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::false_)
440
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::false_)
437
441
  { return hash_value % bucket_cnt; }
438
442
 
439
- inline std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::true_)
443
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::true_)
440
444
  { return hash_value & (bucket_cnt - 1); }
441
445
 
442
446
  template<bool Power2Buckets, bool Incremental>
443
- inline std::size_t hash_to_bucket_split(std::size_t hash_value, std::size_t bucket_cnt, std::size_t split)
447
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket_split(std::size_t hash_value, std::size_t bucket_cnt, std::size_t split)
444
448
  {
445
449
  std::size_t bucket_number = detail::hash_to_bucket(hash_value, bucket_cnt, detail::bool_<Power2Buckets>());
446
450
  if(Incremental)
@@ -535,11 +539,11 @@ struct downcast_node_to_value_t
535
539
  template rebind_pointer
536
540
  <const ValueTraits>::type const_value_traits_ptr;
537
541
 
538
- downcast_node_to_value_t(const const_value_traits_ptr &ptr)
542
+ BOOST_INTRUSIVE_FORCEINLINE downcast_node_to_value_t(const const_value_traits_ptr &ptr)
539
543
  : base_t(ptr)
540
544
  {}
541
545
 
542
- result_type operator()(first_argument_type arg) const
546
+ BOOST_INTRUSIVE_FORCEINLINE result_type operator()(first_argument_type arg) const
543
547
  { return this->base_t::operator()(static_cast<intermediate_argument_type>(arg)); }
544
548
  };
545
549
 
@@ -554,14 +558,14 @@ struct node_cast_adaptor
554
558
  typedef typename pointer_traits<NodePtr>::element_type node;
555
559
 
556
560
  template<class ConvertibleToF, class RealValuTraits>
557
- node_cast_adaptor(const ConvertibleToF &c2f, const RealValuTraits *traits)
561
+ BOOST_INTRUSIVE_FORCEINLINE node_cast_adaptor(const ConvertibleToF &c2f, const RealValuTraits *traits)
558
562
  : base_t(base_t(c2f, traits))
559
563
  {}
560
564
 
561
- typename base_t::node_ptr operator()(const slist_node &to_clone)
565
+ BOOST_INTRUSIVE_FORCEINLINE typename base_t::node_ptr operator()(const slist_node &to_clone)
562
566
  { return base_t::operator()(static_cast<const node &>(to_clone)); }
563
567
 
564
- void operator()(SlistNodePtr to_clone)
568
+ BOOST_INTRUSIVE_FORCEINLINE void operator()(SlistNodePtr to_clone)
565
569
  {
566
570
  base_t::operator()(pointer_traits<NodePtr>::pointer_to(static_cast<node &>(*to_clone)));
567
571
  }
@@ -610,56 +614,57 @@ struct bucket_plus_vtraits
610
614
  <value_traits>::type bucket_ptr;
611
615
 
612
616
  template<class BucketTraitsType>
613
- bucket_plus_vtraits(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits)
617
+ BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits)
614
618
  : data(val_traits, ::boost::forward<BucketTraitsType>(b_traits))
615
619
  {}
616
620
 
617
- bucket_plus_vtraits & operator =(const bucket_plus_vtraits &x)
621
+ BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits & operator =(const bucket_plus_vtraits &x)
618
622
  { data.bucket_traits_ = x.data.bucket_traits_; return *this; }
619
623
 
620
- const_value_traits_ptr priv_value_traits_ptr() const
624
+ BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const
621
625
  { return pointer_traits<const_value_traits_ptr>::pointer_to(this->priv_value_traits()); }
622
626
 
623
627
  //bucket_value_traits
624
628
  //
625
- const bucket_plus_vtraits &get_bucket_value_traits() const
629
+ BOOST_INTRUSIVE_FORCEINLINE const bucket_plus_vtraits &get_bucket_value_traits() const
626
630
  { return *this; }
627
631
 
628
- bucket_plus_vtraits &get_bucket_value_traits()
632
+ BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits &get_bucket_value_traits()
629
633
  { return *this; }
630
634
 
631
- const_bucket_value_traits_ptr bucket_value_traits_ptr() const
635
+ BOOST_INTRUSIVE_FORCEINLINE const_bucket_value_traits_ptr bucket_value_traits_ptr() const
632
636
  { return pointer_traits<const_bucket_value_traits_ptr>::pointer_to(this->get_bucket_value_traits()); }
633
637
 
634
638
  //value traits
635
639
  //
636
- const value_traits &priv_value_traits() const
640
+ BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const
637
641
  { return this->data; }
638
642
 
639
- value_traits &priv_value_traits()
643
+ BOOST_INTRUSIVE_FORCEINLINE value_traits &priv_value_traits()
640
644
  { return this->data; }
641
645
 
642
646
  //bucket_traits
643
647
  //
644
- const bucket_traits &priv_bucket_traits() const
648
+ BOOST_INTRUSIVE_FORCEINLINE const bucket_traits &priv_bucket_traits() const
645
649
  { return this->data.bucket_traits_; }
646
650
 
647
- bucket_traits &priv_bucket_traits()
651
+ BOOST_INTRUSIVE_FORCEINLINE bucket_traits &priv_bucket_traits()
648
652
  { return this->data.bucket_traits_; }
649
653
 
650
654
  //bucket operations
651
- bucket_ptr priv_bucket_pointer() const
655
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_bucket_pointer() const
652
656
  { return this->priv_bucket_traits().bucket_begin(); }
653
657
 
654
658
  typename slist_impl::size_type priv_bucket_count() const
655
659
  { return this->priv_bucket_traits().bucket_count(); }
656
660
 
657
- bucket_ptr priv_invalid_bucket() const
661
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_invalid_bucket() const
658
662
  {
659
663
  const bucket_traits &rbt = this->priv_bucket_traits();
660
664
  return rbt.bucket_begin() + rbt.bucket_count();
661
665
  }
662
- siterator priv_invalid_local_it() const
666
+
667
+ BOOST_INTRUSIVE_FORCEINLINE siterator priv_invalid_local_it() const
663
668
  { return this->priv_bucket_traits().bucket_begin()->before_begin(); }
664
669
 
665
670
  template<class NodeDisposer>
@@ -748,7 +753,7 @@ struct bucket_plus_vtraits
748
753
  }
749
754
 
750
755
  template<class NodeDisposer>
751
- static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::false_) //optimize multikey
756
+ BOOST_INTRUSIVE_FORCEINLINE static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::false_) //optimize multikey
752
757
  { b.erase_after_and_dispose(b.previous(i), node_disposer); }
753
758
 
754
759
  template<class NodeDisposer, bool OptimizeMultikey>
@@ -807,7 +812,7 @@ struct bucket_plus_vtraits
807
812
  return num_erased;
808
813
  }
809
814
 
810
- static siterator priv_get_last(bucket_type &b, detail::false_) //NOT optimize multikey
815
+ BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_last(bucket_type &b, detail::false_) //NOT optimize multikey
811
816
  { return b.previous(b.end()); }
812
817
 
813
818
  static siterator priv_get_previous(bucket_type &b, siterator i, detail::true_) //optimize multikey
@@ -822,7 +827,7 @@ struct bucket_plus_vtraits
822
827
  return bucket_type::s_iterator_to(n);
823
828
  }
824
829
 
825
- static siterator priv_get_previous(bucket_type &b, siterator i, detail::false_) //NOT optimize multikey
830
+ BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_previous(bucket_type &b, siterator i, detail::false_) //NOT optimize multikey
826
831
  { return b.previous(i); }
827
832
 
828
833
  std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::true_) //optimize multikey
@@ -858,22 +863,22 @@ struct bucket_plus_vtraits
858
863
  return static_cast<std::size_t>(&b - &*f);
859
864
  }
860
865
 
861
- static std::size_t priv_stored_hash(slist_node_ptr n, detail::true_) //store_hash
866
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(slist_node_ptr n, detail::true_) //store_hash
862
867
  { return node_traits::get_hash(detail::dcast_bucket_ptr<node>(n)); }
863
868
 
864
- static std::size_t priv_stored_hash(slist_node_ptr, detail::false_) //NO store_hash
869
+ BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(slist_node_ptr, detail::false_) //NO store_hash
865
870
  { return std::size_t(-1); }
866
871
 
867
- node &priv_value_to_node(reference v)
872
+ BOOST_INTRUSIVE_FORCEINLINE node &priv_value_to_node(reference v)
868
873
  { return *this->priv_value_traits().to_node_ptr(v); }
869
874
 
870
- const node &priv_value_to_node(const_reference v) const
875
+ BOOST_INTRUSIVE_FORCEINLINE const node &priv_value_to_node(const_reference v) const
871
876
  { return *this->priv_value_traits().to_node_ptr(v); }
872
877
 
873
- reference priv_value_from_slist_node(slist_node_ptr n)
878
+ BOOST_INTRUSIVE_FORCEINLINE reference priv_value_from_slist_node(slist_node_ptr n)
874
879
  { return *this->priv_value_traits().to_value_ptr(detail::dcast_bucket_ptr<node>(n)); }
875
880
 
876
- const_reference priv_value_from_slist_node(slist_node_ptr n) const
881
+ BOOST_INTRUSIVE_FORCEINLINE const_reference priv_value_from_slist_node(slist_node_ptr n) const
877
882
  { return *this->priv_value_traits().to_value_ptr(detail::dcast_bucket_ptr<node>(n)); }
878
883
 
879
884
  void priv_clear_buckets(const bucket_ptr buckets_ptr, const size_type bucket_cnt)
@@ -889,19 +894,19 @@ struct bucket_plus_vtraits
889
894
  }
890
895
  }
891
896
 
892
- std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const //For store_hash == true
897
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const //For store_hash == true
893
898
  { return node_traits::get_hash(this->priv_value_traits().to_node_ptr(v)); }
894
899
 
895
900
  typedef hashtable_iterator<bucket_plus_vtraits, false> iterator;
896
901
  typedef hashtable_iterator<bucket_plus_vtraits, true> const_iterator;
897
902
 
898
- iterator end()
903
+ BOOST_INTRUSIVE_FORCEINLINE iterator end()
899
904
  { return iterator(this->priv_invalid_local_it(), 0); }
900
905
 
901
- const_iterator end() const
906
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const
902
907
  { return this->cend(); }
903
908
 
904
- const_iterator cend() const
909
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const
905
910
  { return const_iterator(this->priv_invalid_local_it(), 0); }
906
911
 
907
912
  static size_type suggested_upper_bucket_count(size_type n)
@@ -926,9 +931,10 @@ struct bucket_plus_vtraits
926
931
  struct data_type : public ValueTraits
927
932
  {
928
933
  template<class BucketTraitsType>
929
- data_type(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits)
934
+ BOOST_INTRUSIVE_FORCEINLINE data_type(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits)
930
935
  : ValueTraits(val_traits), bucket_traits_(::boost::forward<BucketTraitsType>(b_traits))
931
936
  {}
937
+
932
938
  bucket_traits bucket_traits_;
933
939
  } data;
934
940
  };
@@ -1020,11 +1026,11 @@ struct bucket_hash_t
1020
1026
  typedef detail::ebo_functor_holder<hasher> base_t;
1021
1027
 
1022
1028
  template<class BucketTraitsType>
1023
- bucket_hash_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h)
1029
+ BOOST_INTRUSIVE_FORCEINLINE bucket_hash_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h)
1024
1030
  : detail::ebo_functor_holder<hasher>(h), bucket_plus_vtraits_t(val_traits, ::boost::forward<BucketTraitsType>(b_traits))
1025
1031
  {}
1026
1032
 
1027
- const hasher &priv_hasher() const
1033
+ BOOST_INTRUSIVE_FORCEINLINE const hasher &priv_hasher() const
1028
1034
  { return this->base_t::get(); }
1029
1035
 
1030
1036
  hasher &priv_hasher()
@@ -1032,7 +1038,7 @@ struct bucket_hash_t
1032
1038
 
1033
1039
  using bucket_plus_vtraits_t::priv_stored_or_compute_hash; //For store_hash == true
1034
1040
 
1035
- std::size_t priv_stored_or_compute_hash(const value_type &v, detail::false_) const //For store_hash == false
1041
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_stored_or_compute_hash(const value_type &v, detail::false_) const //For store_hash == false
1036
1042
  { return this->priv_hasher()(key_of_value()(v)); }
1037
1043
  };
1038
1044
 
@@ -1077,19 +1083,19 @@ struct bucket_hash_equal_t
1077
1083
  , equal_holder_t(e)
1078
1084
  {}
1079
1085
 
1080
- bucket_ptr priv_get_cache()
1086
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_cache()
1081
1087
  { return this->bucket_hash_type::priv_bucket_pointer(); }
1082
1088
 
1083
- void priv_set_cache(const bucket_ptr &)
1089
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(const bucket_ptr &)
1084
1090
  {}
1085
1091
 
1086
- size_type priv_get_cache_bucket_num()
1092
+ BOOST_INTRUSIVE_FORCEINLINE size_type priv_get_cache_bucket_num()
1087
1093
  { return 0u; }
1088
1094
 
1089
- void priv_initialize_cache()
1095
+ BOOST_INTRUSIVE_FORCEINLINE void priv_initialize_cache()
1090
1096
  {}
1091
1097
 
1092
- void priv_swap_cache(bucket_hash_equal_t &)
1098
+ BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &)
1093
1099
  {}
1094
1100
 
1095
1101
  siterator priv_begin() const
@@ -1105,19 +1111,19 @@ struct bucket_hash_equal_t
1105
1111
  return this->bucket_hash_type::priv_invalid_local_it();
1106
1112
  }
1107
1113
 
1108
- void priv_insertion_update_cache(size_type)
1114
+ BOOST_INTRUSIVE_FORCEINLINE void priv_insertion_update_cache(size_type)
1109
1115
  {}
1110
1116
 
1111
- void priv_erasure_update_cache_range(size_type, size_type)
1117
+ BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache_range(size_type, size_type)
1112
1118
  {}
1113
1119
 
1114
- void priv_erasure_update_cache()
1120
+ BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache()
1115
1121
  {}
1116
1122
 
1117
- const key_equal &priv_equal() const
1123
+ BOOST_INTRUSIVE_FORCEINLINE const key_equal &priv_equal() const
1118
1124
  { return this->equal_holder_t::get(); }
1119
1125
 
1120
- key_equal &priv_equal()
1126
+ BOOST_INTRUSIVE_FORCEINLINE key_equal &priv_equal()
1121
1127
  { return this->equal_holder_t::get(); }
1122
1128
  };
1123
1129
 
@@ -1151,22 +1157,22 @@ struct bucket_hash_equal_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrK
1151
1157
  typedef typename detail::unordered_bucket_ptr_impl
1152
1158
  <typename bucket_hash_type::value_traits>::type bucket_ptr;
1153
1159
 
1154
- bucket_ptr &priv_get_cache()
1160
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr &priv_get_cache()
1155
1161
  { return cached_begin_; }
1156
1162
 
1157
- const bucket_ptr &priv_get_cache() const
1163
+ BOOST_INTRUSIVE_FORCEINLINE const bucket_ptr &priv_get_cache() const
1158
1164
  { return cached_begin_; }
1159
1165
 
1160
- void priv_set_cache(const bucket_ptr &p)
1166
+ BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(const bucket_ptr &p)
1161
1167
  { cached_begin_ = p; }
1162
1168
 
1163
- std::size_t priv_get_cache_bucket_num()
1169
+ BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_get_cache_bucket_num()
1164
1170
  { return this->cached_begin_ - this->bucket_hash_type::priv_bucket_pointer(); }
1165
1171
 
1166
- void priv_initialize_cache()
1172
+ BOOST_INTRUSIVE_FORCEINLINE void priv_initialize_cache()
1167
1173
  { this->cached_begin_ = this->bucket_hash_type::priv_invalid_bucket(); }
1168
1174
 
1169
- void priv_swap_cache(bucket_hash_equal_t &other)
1175
+ BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &other)
1170
1176
  {
1171
1177
  ::boost::adl_move_swap(this->cached_begin_, other.cached_begin_);
1172
1178
  }
@@ -1189,10 +1195,10 @@ struct bucket_hash_equal_t<ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrK
1189
1195
  }
1190
1196
  }
1191
1197
 
1192
- const key_equal &priv_equal() const
1198
+ BOOST_INTRUSIVE_FORCEINLINE const key_equal &priv_equal() const
1193
1199
  { return this->equal_holder_t::get(); }
1194
1200
 
1195
- key_equal &priv_equal()
1201
+ BOOST_INTRUSIVE_FORCEINLINE key_equal &priv_equal()
1196
1202
  { return this->equal_holder_t::get(); }
1197
1203
 
1198
1204
  void priv_erasure_update_cache_range(size_type first_bucket_num, size_type last_bucket_num)
@@ -1243,10 +1249,13 @@ struct hashtable_size_traits_wrapper
1243
1249
 
1244
1250
  size_traits size_traits_;
1245
1251
 
1246
- const size_traits &priv_size_traits() const
1252
+ typedef const size_traits & size_traits_const_t;
1253
+ typedef size_traits & size_traits_t;
1254
+
1255
+ BOOST_INTRUSIVE_FORCEINLINE size_traits_const_t priv_size_traits() const
1247
1256
  { return size_traits_; }
1248
1257
 
1249
- size_traits &priv_size_traits()
1258
+ BOOST_INTRUSIVE_FORCEINLINE size_traits_t priv_size_traits()
1250
1259
  { return size_traits_; }
1251
1260
  };
1252
1261
 
@@ -1265,18 +1274,13 @@ struct hashtable_size_traits_wrapper<DeriveFrom, SizeType, false>
1265
1274
 
1266
1275
  typedef detail::size_holder< false, SizeType> size_traits;
1267
1276
 
1268
- const size_traits &priv_size_traits() const
1269
- { return size_traits_; }
1277
+ typedef size_traits size_traits_const_t;
1278
+ typedef size_traits size_traits_t;
1270
1279
 
1271
- size_traits &priv_size_traits()
1272
- { return size_traits_; }
1273
-
1274
- static size_traits size_traits_;
1280
+ BOOST_INTRUSIVE_FORCEINLINE size_traits priv_size_traits() const
1281
+ { return size_traits(); }
1275
1282
  };
1276
1283
 
1277
- template<class DeriveFrom, class SizeType>
1278
- detail::size_holder< false, SizeType > hashtable_size_traits_wrapper<DeriveFrom, SizeType, false>::size_traits_;
1279
-
1280
1284
  //hashdata_internal
1281
1285
  //Stores bucket_hash_equal_t and split_traits
1282
1286
  template<class ValueTraits, class VoidOrKeyOfValue, class VoidOrKeyHash, class VoidOrKeyEqual, class BucketTraits, class SizeType, std::size_t BoolFlags>
@@ -1360,10 +1364,10 @@ struct hashdata_internal
1360
1364
  : internal_type(val_traits, ::boost::forward<BucketTraitsType>(b_traits), h, e)
1361
1365
  {}
1362
1366
 
1363
- split_traits &priv_split_traits()
1367
+ BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_t priv_split_traits()
1364
1368
  { return this->priv_size_traits(); }
1365
1369
 
1366
- const split_traits &priv_split_traits() const
1370
+ BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_const_t priv_split_traits() const
1367
1371
  { return this->priv_size_traits(); }
1368
1372
 
1369
1373
  ~hashdata_internal()
@@ -1402,12 +1406,12 @@ struct hashdata_internal
1402
1406
  { return bucket_plus_vtraits<ValueTraits, BucketTraits>::priv_stored_hash(n, false_value); }
1403
1407
 
1404
1408
  //public functions
1405
- SizeType split_count() const
1409
+ BOOST_INTRUSIVE_FORCEINLINE SizeType split_count() const
1406
1410
  {
1407
1411
  return this->priv_split_traits().get_size();
1408
1412
  }
1409
1413
 
1410
- iterator iterator_to(reference value)
1414
+ BOOST_INTRUSIVE_FORCEINLINE iterator iterator_to(reference value)
1411
1415
  {
1412
1416
  return iterator(bucket_type::s_iterator_to
1413
1417
  (this->priv_value_to_node(value)), &this->get_bucket_value_traits());
@@ -1454,19 +1458,19 @@ struct hashdata_internal
1454
1458
  return const_local_iterator(sit, this->priv_value_traits_ptr());
1455
1459
  }
1456
1460
 
1457
- size_type bucket_count() const
1461
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket_count() const
1458
1462
  { return this->priv_bucket_count(); }
1459
1463
 
1460
- size_type bucket_size(size_type n) const
1464
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket_size(size_type n) const
1461
1465
  { return this->priv_bucket_pointer()[n].size(); }
1462
1466
 
1463
- bucket_ptr bucket_pointer() const
1467
+ BOOST_INTRUSIVE_FORCEINLINE bucket_ptr bucket_pointer() const
1464
1468
  { return this->priv_bucket_pointer(); }
1465
1469
 
1466
- local_iterator begin(size_type n)
1470
+ BOOST_INTRUSIVE_FORCEINLINE local_iterator begin(size_type n)
1467
1471
  { return local_iterator(this->priv_bucket_pointer()[n].begin(), this->priv_value_traits_ptr()); }
1468
1472
 
1469
- const_local_iterator begin(size_type n) const
1473
+ BOOST_INTRUSIVE_FORCEINLINE const_local_iterator begin(size_type n) const
1470
1474
  { return this->cbegin(n); }
1471
1475
 
1472
1476
  const_local_iterator cbegin(size_type n) const
@@ -1481,7 +1485,7 @@ struct hashdata_internal
1481
1485
  local_iterator end(size_type n)
1482
1486
  { return local_iterator(this->priv_bucket_pointer()[n].end(), this->priv_value_traits_ptr()); }
1483
1487
 
1484
- const_local_iterator end(size_type n) const
1488
+ BOOST_INTRUSIVE_FORCEINLINE const_local_iterator end(size_type n) const
1485
1489
  { return this->cend(n); }
1486
1490
 
1487
1491
  const_local_iterator cend(size_type n) const
@@ -1493,19 +1497,19 @@ struct hashdata_internal
1493
1497
 
1494
1498
  //Public functions for hashtable_impl
1495
1499
 
1496
- iterator begin()
1500
+ BOOST_INTRUSIVE_FORCEINLINE iterator begin()
1497
1501
  { return iterator(this->priv_begin(), &this->get_bucket_value_traits()); }
1498
1502
 
1499
- const_iterator begin() const
1503
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const
1500
1504
  { return this->cbegin(); }
1501
1505
 
1502
- const_iterator cbegin() const
1506
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const
1503
1507
  { return const_iterator(this->priv_begin(), &this->get_bucket_value_traits()); }
1504
1508
 
1505
- hasher hash_function() const
1509
+ BOOST_INTRUSIVE_FORCEINLINE hasher hash_function() const
1506
1510
  { return this->priv_hasher(); }
1507
1511
 
1508
- key_equal key_eq() const
1512
+ BOOST_INTRUSIVE_FORCEINLINE key_equal key_eq() const
1509
1513
  { return this->priv_equal(); }
1510
1514
  };
1511
1515
 
@@ -1790,15 +1794,10 @@ class hashtable_impl
1790
1794
  {
1791
1795
  this->priv_swap_cache(x);
1792
1796
  x.priv_initialize_cache();
1793
- if(constant_time_size){
1794
- this->priv_size_traits().set_size(size_type(0));
1795
- this->priv_size_traits().set_size(x.priv_size_traits().get_size());
1796
- x.priv_size_traits().set_size(size_type(0));
1797
- }
1798
- if(incremental){
1799
- this->priv_split_traits().set_size(x.priv_split_traits().get_size());
1800
- x.priv_split_traits().set_size(size_type(0));
1801
- }
1797
+ this->priv_size_traits().set_size(x.priv_size_traits().get_size());
1798
+ x.priv_size_traits().set_size(size_type(0));
1799
+ this->priv_split_traits().set_size(x.priv_split_traits().get_size());
1800
+ x.priv_split_traits().set_size(size_type(0));
1802
1801
  }
1803
1802
 
1804
1803
  //! <b>Effects</b>: to-do
@@ -1946,8 +1945,8 @@ class hashtable_impl
1946
1945
  ::boost::adl_move_swap(this->priv_bucket_traits(), other.priv_bucket_traits());
1947
1946
  ::boost::adl_move_swap(this->priv_value_traits(), other.priv_value_traits());
1948
1947
  this->priv_swap_cache(other);
1949
- ::boost::adl_move_swap(this->priv_size_traits(), other.priv_size_traits());
1950
- ::boost::adl_move_swap(this->priv_split_traits(), other.priv_split_traits());
1948
+ this->priv_size_traits().swap(other.priv_size_traits());
1949
+ this->priv_split_traits().swap(other.priv_split_traits());
1951
1950
  }
1952
1951
 
1953
1952
  //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw
@@ -1970,7 +1969,7 @@ class hashtable_impl
1970
1969
  //! <b>Throws</b>: If cloner or hasher throw or hash or equality predicate copying
1971
1970
  //! throws. Basic guarantee.
1972
1971
  template <class Cloner, class Disposer>
1973
- void clone_from(const hashtable_impl &src, Cloner cloner, Disposer disposer)
1972
+ BOOST_INTRUSIVE_FORCEINLINE void clone_from(const hashtable_impl &src, Cloner cloner, Disposer disposer)
1974
1973
  { this->priv_clone_from(src, cloner, disposer); }
1975
1974
 
1976
1975
  //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw
@@ -1993,7 +1992,7 @@ class hashtable_impl
1993
1992
  //! <b>Throws</b>: If cloner or hasher throw or hash or equality predicate copying
1994
1993
  //! throws. Basic guarantee.
1995
1994
  template <class Cloner, class Disposer>
1996
- void clone_from(BOOST_RV_REF(hashtable_impl) src, Cloner cloner, Disposer disposer)
1995
+ BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(hashtable_impl) src, Cloner cloner, Disposer disposer)
1997
1996
  { this->priv_clone_from(static_cast<hashtable_impl&>(src), cloner, disposer); }
1998
1997
 
1999
1998
  //! <b>Requires</b>: value must be an lvalue
@@ -2057,8 +2056,7 @@ class hashtable_impl
2057
2056
  std::pair<iterator, bool> insert_unique(reference value)
2058
2057
  {
2059
2058
  insert_commit_data commit_data;
2060
- std::pair<iterator, bool> ret = this->insert_unique_check
2061
- (key_of_value()(value), this->priv_hasher(), this->priv_equal(), commit_data);
2059
+ std::pair<iterator, bool> ret = this->insert_unique_check(key_of_value()(value), commit_data);
2062
2060
  if(ret.second){
2063
2061
  ret.first = this->insert_unique_commit(value, commit_data);
2064
2062
  }
@@ -2134,6 +2132,37 @@ class hashtable_impl
2134
2132
  , pos == this->priv_invalid_local_it());
2135
2133
  }
2136
2134
 
2135
+ //! <b>Effects</b>: Checks if a value can be inserted in the unordered_set, using
2136
+ //! a user provided key instead of the value itself.
2137
+ //!
2138
+ //! <b>Returns</b>: If there is an equivalent value
2139
+ //! returns a pair containing an iterator to the already present value
2140
+ //! and false. If the value can be inserted returns true in the returned
2141
+ //! pair boolean and fills "commit_data" that is meant to be used with
2142
+ //! the "insert_commit" function.
2143
+ //!
2144
+ //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
2145
+ //!
2146
+ //! <b>Throws</b>: If hasher or key_compare throw. Strong guarantee.
2147
+ //!
2148
+ //! <b>Notes</b>: This function is used to improve performance when constructing
2149
+ //! a value_type is expensive: if there is an equivalent value
2150
+ //! the constructed object must be discarded. Many times, the part of the
2151
+ //! node that is used to impose the hash or the equality is much cheaper to
2152
+ //! construct than the value_type and this function offers the possibility to
2153
+ //! use that the part to check if the insertion will be successful.
2154
+ //!
2155
+ //! If the check is successful, the user can construct the value_type and use
2156
+ //! "insert_commit" to insert the object in constant-time.
2157
+ //!
2158
+ //! "commit_data" remains valid for a subsequent "insert_commit" only if no more
2159
+ //! objects are inserted or erased from the unordered_set.
2160
+ //!
2161
+ //! After a successful rehashing insert_commit_data remains valid.
2162
+ BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator, bool> insert_unique_check
2163
+ ( const key_type &key, insert_commit_data &commit_data)
2164
+ { return this->insert_unique_check(key, this->priv_hasher(), this->priv_equal(), commit_data); }
2165
+
2137
2166
  //! <b>Requires</b>: value must be an lvalue of type value_type. commit_data
2138
2167
  //! must have been obtained from a previous call to "insert_check".
2139
2168
  //! No objects should have been inserted or erased from the unordered_set between
@@ -2174,7 +2203,7 @@ class hashtable_impl
2174
2203
  //!
2175
2204
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2176
2205
  //! to the erased element. No destructors are called.
2177
- void erase(const_iterator i)
2206
+ BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator i)
2178
2207
  { this->erase_and_dispose(i, detail::null_disposer()); }
2179
2208
 
2180
2209
  //! <b>Effects</b>: Erases the range pointed to by b end e.
@@ -2186,7 +2215,7 @@ class hashtable_impl
2186
2215
  //!
2187
2216
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2188
2217
  //! to the erased elements. No destructors are called.
2189
- void erase(const_iterator b, const_iterator e)
2218
+ BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator b, const_iterator e)
2190
2219
  { this->erase_and_dispose(b, e, detail::null_disposer()); }
2191
2220
 
2192
2221
  //! <b>Effects</b>: Erases all the elements with the given value.
@@ -2201,7 +2230,7 @@ class hashtable_impl
2201
2230
  //!
2202
2231
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2203
2232
  //! to the erased elements. No destructors are called.
2204
- size_type erase(const key_type &key)
2233
+ BOOST_INTRUSIVE_FORCEINLINE size_type erase(const key_type &key)
2205
2234
  { return this->erase(key, this->priv_hasher(), this->priv_equal()); }
2206
2235
 
2207
2236
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
@@ -2225,7 +2254,7 @@ class hashtable_impl
2225
2254
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2226
2255
  //! to the erased elements. No destructors are called.
2227
2256
  template<class KeyType, class KeyHasher, class KeyEqual>
2228
- size_type erase(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func)
2257
+ BOOST_INTRUSIVE_FORCEINLINE size_type erase(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func)
2229
2258
  { return this->erase_and_dispose(key, hash_func, equal_func, detail::null_disposer()); }
2230
2259
 
2231
2260
  //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -2312,7 +2341,7 @@ class hashtable_impl
2312
2341
  //! <b>Note</b>: Invalidates the iterators (but not the references)
2313
2342
  //! to the erased elements. No destructors are called.
2314
2343
  template<class Disposer>
2315
- size_type erase_and_dispose(const key_type &key, Disposer disposer)
2344
+ BOOST_INTRUSIVE_FORCEINLINE size_type erase_and_dispose(const key_type &key, Disposer disposer)
2316
2345
  { return this->erase_and_dispose(key, this->priv_hasher(), this->priv_equal(), disposer); }
2317
2346
 
2318
2347
  //! <b>Requires</b>: Disposer::operator()(pointer) shouldn't throw.
@@ -2410,7 +2439,7 @@ class hashtable_impl
2410
2439
  //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
2411
2440
  //!
2412
2441
  //! <b>Throws</b>: If the internal hasher or the equality functor throws.
2413
- size_type count(const key_type &key) const
2442
+ BOOST_INTRUSIVE_FORCEINLINE size_type count(const key_type &key) const
2414
2443
  { return this->count(key, this->priv_hasher(), this->priv_equal()); }
2415
2444
 
2416
2445
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
@@ -2441,7 +2470,7 @@ class hashtable_impl
2441
2470
  //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
2442
2471
  //!
2443
2472
  //! <b>Throws</b>: If the internal hasher or the equality functor throws.
2444
- iterator find(const key_type &key)
2473
+ BOOST_INTRUSIVE_FORCEINLINE iterator find(const key_type &key)
2445
2474
  { return this->find(key, this->priv_hasher(), this->priv_equal()); }
2446
2475
 
2447
2476
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
@@ -2479,7 +2508,7 @@ class hashtable_impl
2479
2508
  //! <b>Complexity</b>: Average case O(1), worst case O(this->size()).
2480
2509
  //!
2481
2510
  //! <b>Throws</b>: If the internal hasher or the equality functor throws.
2482
- const_iterator find(const key_type &key) const
2511
+ BOOST_INTRUSIVE_FORCEINLINE const_iterator find(const key_type &key) const
2483
2512
  { return this->find(key, this->priv_hasher(), this->priv_equal()); }
2484
2513
 
2485
2514
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
@@ -2519,7 +2548,7 @@ class hashtable_impl
2519
2548
  //! <b>Complexity</b>: Average case O(this->count(value)). Worst case O(this->size()).
2520
2549
  //!
2521
2550
  //! <b>Throws</b>: If the internal hasher or the equality functor throws.
2522
- std::pair<iterator,iterator> equal_range(const key_type &key)
2551
+ BOOST_INTRUSIVE_FORCEINLINE std::pair<iterator,iterator> equal_range(const key_type &key)
2523
2552
  { return this->equal_range(key, this->priv_hasher(), this->priv_equal()); }
2524
2553
 
2525
2554
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
@@ -2560,7 +2589,7 @@ class hashtable_impl
2560
2589
  //! <b>Complexity</b>: Average case O(this->count(value)). Worst case O(this->size()).
2561
2590
  //!
2562
2591
  //! <b>Throws</b>: If the internal hasher or the equality functor throws.
2563
- std::pair<const_iterator, const_iterator>
2592
+ BOOST_INTRUSIVE_FORCEINLINE std::pair<const_iterator, const_iterator>
2564
2593
  equal_range(const key_type &key) const
2565
2594
  { return this->equal_range(key, this->priv_hasher(), this->priv_equal()); }
2566
2595
 
@@ -2695,7 +2724,7 @@ class hashtable_impl
2695
2724
  //! <b>Throws</b>: If the hash functor throws.
2696
2725
  //!
2697
2726
  //! <b>Note</b>: the return value is in the range [0, this->bucket_count()).
2698
- size_type bucket(const key_type& k) const
2727
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const key_type& k) const
2699
2728
  { return this->bucket(k, this->priv_hasher()); }
2700
2729
 
2701
2730
  //! <b>Requires</b>: "hash_func" must be a hash function that induces
@@ -2711,7 +2740,7 @@ class hashtable_impl
2711
2740
  //!
2712
2741
  //! <b>Note</b>: the return value is in the range [0, this->bucket_count()).
2713
2742
  template<class KeyType, class KeyHasher>
2714
- size_type bucket(const KeyType& k, KeyHasher hash_func) const
2743
+ BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const KeyType& k, KeyHasher hash_func) const
2715
2744
  { return this->priv_hash_to_bucket(hash_func(k)); }
2716
2745
 
2717
2746
  #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
@@ -2808,101 +2837,52 @@ class hashtable_impl
2808
2837
  //! new_bucket_traits.bucket_count() can be bigger or smaller than this->bucket_count().
2809
2838
  //! 'new_bucket_traits' copy constructor should not throw.
2810
2839
  //!
2811
- //! <b>Effects</b>: Updates the internal reference with the new bucket, erases
2812
- //! the values from the old bucket and inserts then in the new one.
2840
+ //! <b>Effects</b>:
2841
+ //! If `new_bucket_traits.bucket_begin() == this->bucket_pointer()` is false,
2842
+ //! unlinks values from the old bucket and inserts then in the new one according
2843
+ //! to the hash value of values.
2844
+ //!
2845
+ //! If `new_bucket_traits.bucket_begin() == this->bucket_pointer()` is true,
2846
+ //! the implementations avoids moving values as much as possible.
2847
+ //!
2813
2848
  //! Bucket traits hold by *this is assigned from new_bucket_traits.
2814
2849
  //! If the container is configured as incremental<>, the split bucket is set
2815
2850
  //! to the new bucket_count().
2816
2851
  //!
2817
2852
  //! If store_hash option is true, this method does not use the hash function.
2853
+ //! If false, the implementation tries to minimize calls to the hash function
2854
+ //! (e.g. once for equivalent values if optimize_multikey<true> is true).
2855
+ //!
2856
+ //! If rehash is successful updates the internal bucket_traits with new_bucket_traits.
2818
2857
  //!
2819
2858
  //! <b>Complexity</b>: Average case linear in this->size(), worst case quadratic.
2820
2859
  //!
2821
2860
  //! <b>Throws</b>: If the hasher functor throws. Basic guarantee.
2822
- void rehash(const bucket_traits &new_bucket_traits)
2823
- {
2824
- const bucket_ptr new_buckets = new_bucket_traits.bucket_begin();
2825
- size_type new_bucket_count = new_bucket_traits.bucket_count();
2826
- const bucket_ptr old_buckets = this->priv_bucket_pointer();
2827
- size_type old_bucket_count = this->priv_bucket_count();
2861
+ BOOST_INTRUSIVE_FORCEINLINE void rehash(const bucket_traits &new_bucket_traits)
2862
+ { this->rehash_impl(new_bucket_traits, false); }
2828
2863
 
2829
- //Check power of two bucket array if the option is activated
2830
- BOOST_INTRUSIVE_INVARIANT_ASSERT
2831
- (!power_2_buckets || (0 == (new_bucket_count & (new_bucket_count-1u))));
2832
-
2833
- size_type n = this->priv_get_cache_bucket_num();
2834
- const bool same_buffer = old_buckets == new_buckets;
2835
- //If the new bucket length is a common factor
2836
- //of the old one we can avoid hash calculations.
2837
- const bool fast_shrink = (!incremental) && (old_bucket_count >= new_bucket_count) &&
2838
- (power_2_buckets || (old_bucket_count % new_bucket_count) == 0);
2839
- //If we are shrinking the same bucket array and it's
2840
- //is a fast shrink, just rehash the last nodes
2841
- size_type new_first_bucket_num = new_bucket_count;
2842
- if(same_buffer && fast_shrink && (n < new_bucket_count)){
2843
- new_first_bucket_num = n;
2844
- n = new_bucket_count;
2845
- }
2846
-
2847
- //Anti-exception stuff: they destroy the elements if something goes wrong.
2848
- //If the source and destination buckets are the same, the second rollback function
2849
- //is harmless, because all elements have been already unlinked and destroyed
2850
- typedef detail::init_disposer<node_algorithms> NodeDisposer;
2851
- typedef detail::exception_array_disposer<bucket_type, NodeDisposer, size_type> ArrayDisposer;
2852
- NodeDisposer node_disp;
2853
- ArrayDisposer rollback1(new_buckets[0], node_disp, new_bucket_count);
2854
- ArrayDisposer rollback2(old_buckets[0], node_disp, old_bucket_count);
2855
-
2856
- //Put size in a safe value for rollback exception
2857
- size_type const size_backup = this->priv_size_traits().get_size();
2858
- this->priv_size_traits().set_size(0);
2859
- //Put cache to safe position
2860
- this->priv_initialize_cache();
2861
- this->priv_insertion_update_cache(size_type(0u));
2862
-
2863
- //Iterate through nodes
2864
- for(; n < old_bucket_count; ++n){
2865
- bucket_type &old_bucket = old_buckets[n];
2866
- if(!fast_shrink){
2867
- for( siterator before_i(old_bucket.before_begin()), i(old_bucket.begin()), end_sit(old_bucket.end())
2868
- ; i != end_sit
2869
- ; i = before_i, ++i){
2870
- const value_type &v = this->priv_value_from_slist_node(i.pointed_node());
2871
- const std::size_t hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
2872
- const size_type new_n = detail::hash_to_bucket_split<power_2_buckets, incremental>
2873
- (hash_value, new_bucket_count, new_bucket_count);
2874
- if(cache_begin && new_n < new_first_bucket_num)
2875
- new_first_bucket_num = new_n;
2876
- siterator const last = (priv_last_in_group)(i);
2877
- if(same_buffer && new_n == n){
2878
- before_i = last;
2879
- }
2880
- else{
2881
- bucket_type &new_b = new_buckets[new_n];
2882
- new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last);
2883
- }
2884
- }
2885
- }
2886
- else{
2887
- const size_type new_n = detail::hash_to_bucket_split<power_2_buckets, incremental>(n, new_bucket_count, new_bucket_count);
2888
- if(cache_begin && new_n < new_first_bucket_num)
2889
- new_first_bucket_num = new_n;
2890
- bucket_type &new_b = new_buckets[new_n];
2891
- new_b.splice_after( new_b.before_begin()
2892
- , old_bucket
2893
- , old_bucket.before_begin()
2894
- , bucket_plus_vtraits_t::priv_get_last(old_bucket, optimize_multikey_t()));
2895
- }
2896
- }
2897
-
2898
- this->priv_size_traits().set_size(size_backup);
2899
- this->priv_split_traits().set_size(new_bucket_count);
2900
- this->priv_bucket_traits() = new_bucket_traits;
2901
- this->priv_initialize_cache();
2902
- this->priv_insertion_update_cache(new_first_bucket_num);
2903
- rollback1.release();
2904
- rollback2.release();
2905
- }
2864
+ //! <b>Note</b>: This function is used when keys from inserted elements are changed
2865
+ //! (e.g. a language change when key is a string) but uniqueness and hash properties are
2866
+ //! preserved so a fast full rehash recovers invariants for *this without extracting and
2867
+ //! reinserting all elements again.
2868
+ //!
2869
+ //! <b>Requires</b>: Calls produced to the hash function should not alter the value uniqueness
2870
+ //! properties of already inserted elements. If hasher(key1) == hasher(key2) was true when
2871
+ //! elements were inserted, it shall be true during calls produced in the execution of this function.
2872
+ //!
2873
+ //! key_equal is not called inside this function so it is assumed that key_equal(value1, value2)
2874
+ //! should produce the same results as before for inserted elements.
2875
+ //!
2876
+ //! <b>Effects</b>: Reprocesses all values hold by *this, recalculating their hash values
2877
+ //! and redistributing them though the buckets.
2878
+ //!
2879
+ //! If store_hash option is true, this method uses the hash function and updates the stored hash value.
2880
+ //!
2881
+ //! <b>Complexity</b>: Average case linear in this->size(), worst case quadratic.
2882
+ //!
2883
+ //! <b>Throws</b>: If the hasher functor throws. Basic guarantee.
2884
+ BOOST_INTRUSIVE_FORCEINLINE void full_rehash()
2885
+ { this->rehash_impl(this->priv_bucket_traits(), true); }
2906
2886
 
2907
2887
  //! <b>Requires</b>:
2908
2888
  //!
@@ -3083,9 +3063,113 @@ class hashtable_impl
3083
3063
  { return !(x < y); }
3084
3064
 
3085
3065
  /// @cond
3086
- void check() const {}
3066
+ BOOST_INTRUSIVE_FORCEINLINE void check() const {}
3087
3067
  private:
3088
3068
 
3069
+ void rehash_impl(const bucket_traits &new_bucket_traits, bool do_full_rehash)
3070
+ {
3071
+ const bucket_ptr new_buckets = new_bucket_traits.bucket_begin();
3072
+ size_type new_bucket_count = new_bucket_traits.bucket_count();
3073
+ const bucket_ptr old_buckets = this->priv_bucket_pointer();
3074
+ size_type old_bucket_count = this->priv_bucket_count();
3075
+
3076
+ //Check power of two bucket array if the option is activated
3077
+ BOOST_INTRUSIVE_INVARIANT_ASSERT
3078
+ (!power_2_buckets || (0 == (new_bucket_count & (new_bucket_count-1u))));
3079
+
3080
+ size_type n = this->priv_get_cache_bucket_num();
3081
+ const bool same_buffer = old_buckets == new_buckets;
3082
+ //If the new bucket length is a common factor
3083
+ //of the old one we can avoid hash calculations.
3084
+ const bool fast_shrink = (!do_full_rehash) && (!incremental) && (old_bucket_count >= new_bucket_count) &&
3085
+ (power_2_buckets || (old_bucket_count % new_bucket_count) == 0);
3086
+ //If we are shrinking the same bucket array and it's
3087
+ //is a fast shrink, just rehash the last nodes
3088
+ size_type new_first_bucket_num = new_bucket_count;
3089
+ if(same_buffer && fast_shrink && (n < new_bucket_count)){
3090
+ new_first_bucket_num = n;
3091
+ n = new_bucket_count;
3092
+ }
3093
+
3094
+ //Anti-exception stuff: they destroy the elements if something goes wrong.
3095
+ //If the source and destination buckets are the same, the second rollback function
3096
+ //is harmless, because all elements have been already unlinked and destroyed
3097
+ typedef detail::init_disposer<node_algorithms> NodeDisposer;
3098
+ typedef detail::exception_array_disposer<bucket_type, NodeDisposer, size_type> ArrayDisposer;
3099
+ NodeDisposer node_disp;
3100
+ ArrayDisposer rollback1(new_buckets[0], node_disp, new_bucket_count);
3101
+ ArrayDisposer rollback2(old_buckets[0], node_disp, old_bucket_count);
3102
+
3103
+ //Put size in a safe value for rollback exception
3104
+ size_type const size_backup = this->priv_size_traits().get_size();
3105
+ this->priv_size_traits().set_size(0);
3106
+ //Put cache to safe position
3107
+ this->priv_initialize_cache();
3108
+ this->priv_insertion_update_cache(size_type(0u));
3109
+
3110
+ //Iterate through nodes
3111
+ for(; n < old_bucket_count; ++n){
3112
+ bucket_type &old_bucket = old_buckets[n];
3113
+ if(!fast_shrink){
3114
+ for( siterator before_i(old_bucket.before_begin()), i(old_bucket.begin()), end_sit(old_bucket.end())
3115
+ ; i != end_sit
3116
+ ; i = before_i, ++i){
3117
+
3118
+ //First obtain hash value (and store it if do_full_rehash)
3119
+ std::size_t hash_value;
3120
+ if(do_full_rehash){
3121
+ value_type &v = this->priv_value_from_slist_node(i.pointed_node());
3122
+ hash_value = this->priv_hasher()(key_of_value()(v));
3123
+ node_functions_t::store_hash(pointer_traits<node_ptr>::pointer_to(this->priv_value_to_node(v)), hash_value, store_hash_t());
3124
+ }
3125
+ else{
3126
+ const value_type &v = this->priv_value_from_slist_node(i.pointed_node());
3127
+ hash_value = this->priv_stored_or_compute_hash(v, store_hash_t());
3128
+ }
3129
+
3130
+ //Now calculate the new bucket position
3131
+ const size_type new_n = detail::hash_to_bucket_split<power_2_buckets, incremental>
3132
+ (hash_value, new_bucket_count, new_bucket_count);
3133
+
3134
+ //Update first used bucket cache
3135
+ if(cache_begin && new_n < new_first_bucket_num)
3136
+ new_first_bucket_num = new_n;
3137
+
3138
+ //If the target bucket is new, transfer the whole group
3139
+ siterator const last = (priv_last_in_group)(i);
3140
+
3141
+ if(same_buffer && new_n == n){
3142
+ before_i = last;
3143
+ }
3144
+ else{
3145
+ bucket_type &new_b = new_buckets[new_n];
3146
+ new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last);
3147
+ }
3148
+ }
3149
+ }
3150
+ else{
3151
+ const size_type new_n = detail::hash_to_bucket_split<power_2_buckets, incremental>(n, new_bucket_count, new_bucket_count);
3152
+ if(cache_begin && new_n < new_first_bucket_num)
3153
+ new_first_bucket_num = new_n;
3154
+ bucket_type &new_b = new_buckets[new_n];
3155
+ new_b.splice_after( new_b.before_begin()
3156
+ , old_bucket
3157
+ , old_bucket.before_begin()
3158
+ , bucket_plus_vtraits_t::priv_get_last(old_bucket, optimize_multikey_t()));
3159
+ }
3160
+ }
3161
+
3162
+ this->priv_size_traits().set_size(size_backup);
3163
+ this->priv_split_traits().set_size(new_bucket_count);
3164
+ if(&new_bucket_traits != &this->priv_bucket_traits()){
3165
+ this->priv_bucket_traits() = new_bucket_traits;
3166
+ }
3167
+ this->priv_initialize_cache();
3168
+ this->priv_insertion_update_cache(new_first_bucket_num);
3169
+ rollback1.release();
3170
+ rollback2.release();
3171
+ }
3172
+
3089
3173
  template <class MaybeConstHashtableImpl, class Cloner, class Disposer>
3090
3174
  void priv_clone_from(MaybeConstHashtableImpl &src, Cloner cloner, Disposer disposer)
3091
3175
  {
@@ -3468,26 +3552,26 @@ class hashtable
3468
3552
  //Assert if passed value traits are compatible with the type
3469
3553
  BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
3470
3554
 
3471
- explicit hashtable ( const bucket_traits &b_traits
3555
+ BOOST_INTRUSIVE_FORCEINLINE explicit hashtable ( const bucket_traits &b_traits
3472
3556
  , const hasher & hash_func = hasher()
3473
3557
  , const key_equal &equal_func = key_equal()
3474
3558
  , const value_traits &v_traits = value_traits())
3475
3559
  : Base(b_traits, hash_func, equal_func, v_traits)
3476
3560
  {}
3477
3561
 
3478
- hashtable(BOOST_RV_REF(hashtable) x)
3562
+ BOOST_INTRUSIVE_FORCEINLINE hashtable(BOOST_RV_REF(hashtable) x)
3479
3563
  : Base(BOOST_MOVE_BASE(Base, x))
3480
3564
  {}
3481
3565
 
3482
- hashtable& operator=(BOOST_RV_REF(hashtable) x)
3566
+ BOOST_INTRUSIVE_FORCEINLINE hashtable& operator=(BOOST_RV_REF(hashtable) x)
3483
3567
  { return static_cast<hashtable&>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); }
3484
3568
 
3485
3569
  template <class Cloner, class Disposer>
3486
- void clone_from(const hashtable &src, Cloner cloner, Disposer disposer)
3570
+ BOOST_INTRUSIVE_FORCEINLINE void clone_from(const hashtable &src, Cloner cloner, Disposer disposer)
3487
3571
  { Base::clone_from(src, cloner, disposer); }
3488
3572
 
3489
3573
  template <class Cloner, class Disposer>
3490
- void clone_from(BOOST_RV_REF(hashtable) src, Cloner cloner, Disposer disposer)
3574
+ BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(hashtable) src, Cloner cloner, Disposer disposer)
3491
3575
  { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); }
3492
3576
  };
3493
3577