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
@@ -28,15 +28,74 @@
28
28
  #include <boost/container/detail/type_traits.hpp>
29
29
  #include <boost/container/detail/mpl.hpp>
30
30
  #include <boost/container/detail/std_fwd.hpp>
31
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
32
+ # include <boost/container/detail/variadic_templates_tools.hpp>
33
+ #endif
31
34
  #include <boost/move/adl_move_swap.hpp> //swap
32
35
 
33
36
  #include <boost/intrusive/detail/minimal_pair_header.hpp> //pair
34
37
  #include <boost/move/utility_core.hpp>
38
+ #include<boost/move/detail/fwd_macros.hpp>
39
+
40
+ namespace boost {
41
+ namespace tuples {
42
+
43
+ struct null_type;
44
+
45
+ } //namespace tuples {
46
+ } //namespace boost {
47
+
48
+ #if defined(BOOST_MSVC) && (_CPPLIB_VER == 520)
49
+ //MSVC 2010 tuple marker
50
+ namespace std { namespace tr1 { struct _Nil; }}
51
+ #elif defined(BOOST_MSVC) && (_CPPLIB_VER == 540)
52
+ //MSVC 2012 tuple marker
53
+ namespace std { struct _Nil; }
54
+ #endif
55
+
35
56
 
36
57
  namespace boost {
37
58
  namespace container {
59
+
60
+ #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
61
+
62
+ template <int Dummy = 0>
63
+ struct std_piecewise_construct_holder
64
+ {
65
+ static ::std::piecewise_construct_t *dummy;
66
+ };
67
+
68
+ template <int Dummy>
69
+ ::std::piecewise_construct_t *std_piecewise_construct_holder<Dummy>::dummy =
70
+ reinterpret_cast< ::std::piecewise_construct_t *>(0x01234); //Avoid sanitizer errors on references to null pointers
71
+
72
+ typedef const std::piecewise_construct_t & piecewise_construct_t;
73
+
74
+ struct try_emplace_t{};
75
+
76
+ #else
77
+
78
+ //! The piecewise_construct_t struct is an empty structure type used as a unique type to
79
+ //! disambiguate used to disambiguate between different functions that take two tuple arguments.
80
+ typedef unspecified piecewise_construct_t;
81
+
82
+ #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
83
+
84
+ //! A instance of type
85
+ //! piecewise_construct_t
86
+ static piecewise_construct_t piecewise_construct = BOOST_CONTAINER_DOC1ST(unspecified, *std_piecewise_construct_holder<>::dummy);
87
+
88
+ ///@cond
89
+
38
90
  namespace container_detail {
39
91
 
92
+ struct piecewise_construct_use
93
+ {
94
+ //Avoid warnings of unused "piecewise_construct"
95
+ piecewise_construct_use()
96
+ { (void)&::boost::container::piecewise_construct; }
97
+ };
98
+
40
99
  template <class T1, class T2>
41
100
  struct pair;
42
101
 
@@ -78,6 +137,11 @@ struct is_std_pair< std::pair<T1, T2> >
78
137
 
79
138
  struct pair_nat;
80
139
 
140
+ template<typename T, typename U, typename V>
141
+ void get(T); //to enable ADL
142
+
143
+ ///@endcond
144
+
81
145
  template <class T1, class T2>
82
146
  struct pair
83
147
  {
@@ -147,11 +211,105 @@ struct pair
147
211
  : first(::boost::move(p.first)), second(::boost::move(p.second))
148
212
  {}
149
213
 
150
- //piecewise_construct missing
151
- //template <class U, class V> pair(pair<U, V>&& p);
152
- //template <class... Args1, class... Args2>
153
- // pair(piecewise_construct_t, tuple<Args1...> first_args,
154
- // tuple<Args2...> second_args);
214
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
215
+ template< class KeyType, class ...Args>
216
+ pair(try_emplace_t, BOOST_FWD_REF(KeyType) k, Args && ...args)
217
+ : first(boost::forward<KeyType>(k)), second(::boost::forward<Args>(args)...)\
218
+ {}
219
+ #else
220
+
221
+ //piecewise construction from boost::tuple
222
+ #define BOOST_PAIR_TRY_EMPLACE_CONSTRUCT_CODE(N)\
223
+ template< class KeyType BOOST_MOVE_I##N BOOST_MOVE_CLASS##N > \
224
+ pair( try_emplace_t, BOOST_FWD_REF(KeyType) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N )\
225
+ : first(boost::forward<KeyType>(k)), second(BOOST_MOVE_FWD##N)\
226
+ {}\
227
+ //
228
+ BOOST_MOVE_ITERATE_0TO9(BOOST_PAIR_TRY_EMPLACE_CONSTRUCT_CODE)
229
+ #undef BOOST_PAIR_TRY_EMPLACE_CONSTRUCT_CODE
230
+
231
+ #endif //BOOST_NO_CXX11_VARIADIC_TEMPLATES
232
+
233
+ //piecewise construction from boost::tuple
234
+ #define BOOST_PAIR_PIECEWISE_CONSTRUCT_BOOST_TUPLE_CODE(N,M)\
235
+ template< template<class, class, class, class, class, class, class, class, class, class> class BoostTuple \
236
+ BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
237
+ pair( piecewise_construct_t\
238
+ , BoostTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::boost::tuples::null_type)> p\
239
+ , BoostTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::boost::tuples::null_type)> q)\
240
+ : first(BOOST_MOVE_TMPL_GET##N), second(BOOST_MOVE_TMPL_GETQ##M)\
241
+ { (void)p; (void)q; }\
242
+ //
243
+ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_PAIR_PIECEWISE_CONSTRUCT_BOOST_TUPLE_CODE)
244
+ #undef BOOST_PAIR_PIECEWISE_CONSTRUCT_BOOST_TUPLE_CODE
245
+
246
+ //piecewise construction from variadic tuple (with delegating constructors)
247
+ #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
248
+ # if !defined(BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS)
249
+ private:
250
+ template<template<class ...> class Tuple, class... Args1, class... Args2, size_t... Indexes1, size_t... Indexes2>
251
+ pair(Tuple<Args1...>& t1, Tuple<Args2...>& t2, index_tuple<Indexes1...>, index_tuple<Indexes2...>)
252
+ : first (::boost::forward<Args1>(get<Indexes1>(t1))...)
253
+ , second(::boost::forward<Args2>(get<Indexes2>(t2))...)
254
+ { (void) t1; (void)t2; }
255
+
256
+ public:
257
+ template<template<class ...> class Tuple, class... Args1, class... Args2>
258
+ pair(piecewise_construct_t, Tuple<Args1...> t1, Tuple<Args2...> t2)
259
+ : pair(t1, t2, typename build_number_seq<sizeof...(Args1)>::type(), typename build_number_seq<sizeof...(Args2)>::type())
260
+ {}
261
+ # else
262
+ //piecewise construction from variadic tuple (suboptimal, without delegating constructors)
263
+ private:
264
+ template<typename T, template<class ...> class Tuple, typename... Args>
265
+ static T build_from_args(Tuple<Args...>&& t)
266
+ { return do_build_from_args<T>(::boost::move(t), typename build_number_seq<sizeof...(Args)>::type()); }
267
+
268
+ template<typename T, template<class ...> class Tuple, typename... Args, std::size_t... Indexes>
269
+ static T do_build_from_args(Tuple<Args...> && t, const index_tuple<Indexes...>&)
270
+ { (void)t; return T(::boost::forward<Args>(get<Indexes>(t))...); }
271
+
272
+ public:
273
+ template<template<class ...> class Tuple, class... Args1, class... Args2>
274
+ pair(piecewise_construct_t, Tuple<Args1...> t1, Tuple<Args2...> t2)
275
+ : first (build_from_args<first_type> (::boost::move(t1)))
276
+ , second (build_from_args<second_type>(::boost::move(t2)))
277
+ {}
278
+ # endif //BOOST_NO_CXX11_VARIADIC_TEMPLATES
279
+ #elif defined(BOOST_MSVC) && (_CPPLIB_VER == 520)
280
+ //MSVC 2010 tuple implementation
281
+ #define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE(N,M)\
282
+ template< template<class, class, class, class, class, class, class, class, class, class> class StdTuple \
283
+ BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
284
+ pair( piecewise_construct_t\
285
+ , StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::std::tr1::_Nil)> p\
286
+ , StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::std::tr1::_Nil)> q)\
287
+ : first(BOOST_MOVE_GET_IDX##N), second(BOOST_MOVE_GET_IDXQ##M)\
288
+ { (void)p; (void)q; }\
289
+ //
290
+ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE)
291
+ #undef BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE
292
+ #elif defined(BOOST_MSVC) && (_CPPLIB_VER == 540)
293
+ #if _VARIADIC_MAX >= 9
294
+ #define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT 9
295
+ #else
296
+ #define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT BOOST_MOVE_ADD(_VARIADIC_MAX, 1)
297
+ #endif
298
+
299
+ //MSVC 2012 tuple implementation
300
+ #define BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_CODE(N,M)\
301
+ template< template<BOOST_MOVE_REPEAT(_VARIADIC_MAX, class), class, class, class> class StdTuple \
302
+ BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
303
+ pair( piecewise_construct_t\
304
+ , StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),N),::std::_Nil) > p\
305
+ , StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),M),::std::_Nil) > q)\
306
+ : first(BOOST_MOVE_GET_IDX##N), second(BOOST_MOVE_GET_IDXQ##M)\
307
+ { (void)p; (void)q; }\
308
+ //
309
+ BOOST_MOVE_ITER2D_0TOMAX(BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT, BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_CODE)
310
+ #undef BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2010_TUPLE_CODE
311
+ #undef BOOST_PAIR_PIECEWISE_CONSTRUCT_MSVC2012_TUPLE_MAX_IT
312
+ #endif
155
313
 
156
314
  //pair copy assignment
157
315
  pair& operator=(BOOST_COPY_ASSIGN_REF(pair) p)
@@ -270,53 +428,74 @@ inline void swap(pair<T1, T2>& x, pair<T1, T2>& y)
270
428
  } //namespace container_detail {
271
429
  } //namespace container {
272
430
 
431
+ #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
273
432
 
274
- //Without this specialization recursive flat_(multi)map instantiation fails
275
- //because is_enum needs to instantiate the recursive pair, leading to a compilation error).
276
- //This breaks the cycle clearly stating that pair is not an enum avoiding any instantiation.
277
- template<class T>
278
- struct is_enum;
279
-
280
- template<class T, class U>
281
- struct is_enum< ::boost::container::container_detail::pair<T, U> >
433
+ template<class T1, class T2>
434
+ struct has_move_emulation_enabled< ::boost::container::container_detail::pair<T1, T2> >
282
435
  {
283
- static const bool value = false;
436
+ static const bool value = true;
284
437
  };
285
438
 
286
- template <class T>
287
- struct is_class;
439
+ #endif
288
440
 
441
+ namespace move_detail{
442
+
443
+ template<class T>
444
+ struct is_class_or_union;
445
+
446
+ template <class T1, class T2>
447
+ struct is_class_or_union< ::boost::container::container_detail::pair<T1, T2> >
289
448
  //This specialization is needed to avoid instantiation of pair in
290
449
  //is_class, and allow recursive maps.
291
- template <class T1, class T2>
292
- struct is_class< ::boost::container::container_detail::pair<T1, T2> >
293
450
  {
294
451
  static const bool value = true;
295
452
  };
296
453
 
297
- #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
298
-
299
- template<class T1, class T2>
300
- struct has_move_emulation_enabled< ::boost::container::container_detail::pair<T1, T2> >
454
+ template <class T1, class T2>
455
+ struct is_class_or_union< std::pair<T1, T2> >
456
+ //This specialization is needed to avoid instantiation of pair in
457
+ //is_class, and allow recursive maps.
301
458
  {
302
459
  static const bool value = true;
303
460
  };
304
461
 
305
- #endif
462
+ template<class T>
463
+ struct is_union;
306
464
 
307
- namespace move_detail{
465
+ template <class T1, class T2>
466
+ struct is_union< ::boost::container::container_detail::pair<T1, T2> >
467
+ //This specialization is needed to avoid instantiation of pair in
468
+ //is_class, and allow recursive maps.
469
+ {
470
+ static const bool value = false;
471
+ };
472
+
473
+ template <class T1, class T2>
474
+ struct is_union< std::pair<T1, T2> >
475
+ //This specialization is needed to avoid instantiation of pair in
476
+ //is_class, and allow recursive maps.
477
+ {
478
+ static const bool value = false;
479
+ };
308
480
 
309
481
  template<class T>
310
- struct is_class_or_union;
482
+ struct is_class;
311
483
 
312
484
  template <class T1, class T2>
313
- struct is_class_or_union< ::boost::container::container_detail::pair<T1, T2> >
485
+ struct is_class< ::boost::container::container_detail::pair<T1, T2> >
314
486
  //This specialization is needed to avoid instantiation of pair in
315
487
  //is_class, and allow recursive maps.
316
488
  {
317
489
  static const bool value = true;
318
490
  };
319
491
 
492
+ template <class T1, class T2>
493
+ struct is_class< std::pair<T1, T2> >
494
+ //This specialization is needed to avoid instantiation of pair in
495
+ //is_class, and allow recursive maps.
496
+ {
497
+ static const bool value = true;
498
+ };
320
499
 
321
500
  } //namespace move_detail{
322
501
 
@@ -25,6 +25,7 @@
25
25
  #include <boost/container/allocator_traits.hpp>
26
26
  #include <boost/container/container_fwd.hpp>
27
27
  #include <boost/container/options.hpp>
28
+ #include <boost/container/node_handle.hpp>
28
29
 
29
30
  // container/detail
30
31
  #include <boost/container/detail/algorithm.hpp> //algo_equal(), algo_lexicographical_compare
@@ -50,6 +51,7 @@
50
51
  #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
51
52
  #include <boost/move/detail/fwd_macros.hpp>
52
53
  #endif
54
+ #include <boost/move/detail/move_helpers.hpp>
53
55
  // other
54
56
  #include <boost/core/no_exceptions_support.hpp>
55
57
 
@@ -134,15 +136,15 @@ struct tree_node
134
136
  typedef typename tree_internal_data_type<T>::type internal_type;
135
137
 
136
138
  typedef tree_node< T, VoidPointer
137
- , tree_type_value, OptimizeSize> node_type;
139
+ , tree_type_value, OptimizeSize> node_t;
138
140
 
139
- T &get_data()
141
+ BOOST_CONTAINER_FORCEINLINE T &get_data()
140
142
  {
141
143
  T* ptr = reinterpret_cast<T*>(&this->m_data);
142
144
  return *ptr;
143
145
  }
144
146
 
145
- const T &get_data() const
147
+ BOOST_CONTAINER_FORCEINLINE const T &get_data() const
146
148
  {
147
149
  const T* ptr = reinterpret_cast<const T*>(&this->m_data);
148
150
  return *ptr;
@@ -151,39 +153,39 @@ struct tree_node
151
153
  internal_type m_data;
152
154
 
153
155
  template<class T1, class T2>
154
- void do_assign(const std::pair<const T1, T2> &p)
156
+ BOOST_CONTAINER_FORCEINLINE void do_assign(const std::pair<const T1, T2> &p)
155
157
  {
156
158
  const_cast<T1&>(m_data.first) = p.first;
157
159
  m_data.second = p.second;
158
160
  }
159
161
 
160
162
  template<class T1, class T2>
161
- void do_assign(const pair<const T1, T2> &p)
163
+ BOOST_CONTAINER_FORCEINLINE void do_assign(const pair<const T1, T2> &p)
162
164
  {
163
165
  const_cast<T1&>(m_data.first) = p.first;
164
166
  m_data.second = p.second;
165
167
  }
166
168
 
167
169
  template<class V>
168
- void do_assign(const V &v)
170
+ BOOST_CONTAINER_FORCEINLINE void do_assign(const V &v)
169
171
  { m_data = v; }
170
172
 
171
173
  template<class T1, class T2>
172
- void do_move_assign(std::pair<const T1, T2> &p)
174
+ BOOST_CONTAINER_FORCEINLINE void do_move_assign(std::pair<const T1, T2> &p)
173
175
  {
174
176
  const_cast<T1&>(m_data.first) = ::boost::move(p.first);
175
177
  m_data.second = ::boost::move(p.second);
176
178
  }
177
179
 
178
180
  template<class T1, class T2>
179
- void do_move_assign(pair<const T1, T2> &p)
181
+ BOOST_CONTAINER_FORCEINLINE void do_move_assign(pair<const T1, T2> &p)
180
182
  {
181
183
  const_cast<T1&>(m_data.first) = ::boost::move(p.first);
182
184
  m_data.second = ::boost::move(p.second);
183
185
  }
184
186
 
185
187
  template<class V>
186
- void do_move_assign(V &v)
188
+ BOOST_CONTAINER_FORCEINLINE void do_move_assign(V &v)
187
189
  { m_data = ::boost::move(v); }
188
190
  };
189
191
 
@@ -198,11 +200,11 @@ class insert_equal_end_hint_functor
198
200
  Icont &icont_;
199
201
 
200
202
  public:
201
- insert_equal_end_hint_functor(Icont &icont)
203
+ BOOST_CONTAINER_FORCEINLINE insert_equal_end_hint_functor(Icont &icont)
202
204
  : icont_(icont)
203
205
  {}
204
206
 
205
- void operator()(Node &n)
207
+ BOOST_CONTAINER_FORCEINLINE void operator()(Node &n)
206
208
  { this->icont_.insert_equal(this->icont_.cend(), n); }
207
209
  };
208
210
 
@@ -212,11 +214,11 @@ class push_back_functor
212
214
  Icont &icont_;
213
215
 
214
216
  public:
215
- push_back_functor(Icont &icont)
217
+ BOOST_CONTAINER_FORCEINLINE push_back_functor(Icont &icont)
216
218
  : icont_(icont)
217
219
  {}
218
220
 
219
- void operator()(Node &n)
221
+ BOOST_CONTAINER_FORCEINLINE void operator()(Node &n)
220
222
  { this->icont_.push_back(n); }
221
223
  };
222
224
 
@@ -293,18 +295,18 @@ struct intrusive_tree_type
293
295
  allocator_traits<Allocator>::size_type size_type;
294
296
  typedef typename container_detail::tree_node
295
297
  < value_type, void_pointer
296
- , tree_type_value, OptimizeSize> node_type;
298
+ , tree_type_value, OptimizeSize> node_t;
297
299
  typedef value_to_node_compare
298
- <node_type, ValueCompare> node_compare_type;
299
- //Deducing the hook type from node_type (e.g. node_type::hook_type) would
300
- //provoke an early instantiation of node_type that could ruin recursive
300
+ <node_t, ValueCompare> node_compare_type;
301
+ //Deducing the hook type from node_t (e.g. node_t::hook_type) would
302
+ //provoke an early instantiation of node_t that could ruin recursive
301
303
  //tree definitions, so retype the complete type to avoid any problem.
302
304
  typedef typename intrusive_tree_hook
303
305
  <void_pointer, tree_type_value
304
306
  , OptimizeSize>::type hook_type;
305
307
  public:
306
308
  typedef typename intrusive_tree_dispatch
307
- < node_type, node_compare_type
309
+ < node_t, node_compare_type
308
310
  , size_type, hook_type
309
311
  , tree_type_value>::type type;
310
312
  };
@@ -327,14 +329,14 @@ template< boost::container::tree_type_enum tree_type_value
327
329
  struct intrusive_tree_proxy
328
330
  {
329
331
  template<class Icont>
330
- static void rebalance(Icont &) {}
332
+ BOOST_CONTAINER_FORCEINLINE static void rebalance(Icont &) {}
331
333
  };
332
334
 
333
335
  template<boost::container::tree_type_enum tree_type_value>
334
336
  struct intrusive_tree_proxy<tree_type_value, true>
335
337
  {
336
338
  template<class Icont>
337
- static void rebalance(Icont &c)
339
+ BOOST_CONTAINER_FORCEINLINE static void rebalance(Icont &c)
338
340
  { c.rebalance(); }
339
341
  };
340
342
 
@@ -350,7 +352,7 @@ template<class AllocHolder, bool DoMove>
350
352
  class RecyclingCloner
351
353
  {
352
354
  typedef typename AllocHolder::intrusive_container intrusive_container;
353
- typedef typename AllocHolder::Node node_type;
355
+ typedef typename AllocHolder::Node node_t;
354
356
  typedef typename AllocHolder::NodePtr node_ptr_type;
355
357
 
356
358
  public:
@@ -358,13 +360,13 @@ class RecyclingCloner
358
360
  : m_holder(holder), m_icont(itree)
359
361
  {}
360
362
 
361
- static void do_assign(node_ptr_type &p, const node_type &other, bool_<true>)
362
- { p->do_move_assign(const_cast<node_type &>(other).m_data); }
363
+ BOOST_CONTAINER_FORCEINLINE static void do_assign(node_ptr_type &p, const node_t &other, bool_<true>)
364
+ { p->do_move_assign(const_cast<node_t &>(other).m_data); }
363
365
 
364
- static void do_assign(node_ptr_type &p, const node_type &other, bool_<false>)
366
+ BOOST_CONTAINER_FORCEINLINE static void do_assign(node_ptr_type &p, const node_t &other, bool_<false>)
365
367
  { p->do_assign(other.m_data); }
366
368
 
367
- node_ptr_type operator()(const node_type &other) const
369
+ node_ptr_type operator()(const node_t &other) const
368
370
  {
369
371
  if(node_ptr_type p = m_icont.unlink_leftmost_without_rebalance()){
370
372
  //First recycle a node (this can't throw)
@@ -392,59 +394,63 @@ class RecyclingCloner
392
394
  intrusive_container &m_icont;
393
395
  };
394
396
 
395
- template<class KeyValueCompare, class Node>
396
- //where KeyValueCompare is tree_value_compare<Key, T, Compare, KeyOfValue>
397
+ template<class KeyCompare, class KeyOfValue>
397
398
  struct key_node_compare
398
- : private KeyValueCompare
399
+ : public boost::intrusive::detail::ebo_functor_holder<KeyCompare>
399
400
  {
400
- explicit key_node_compare(const KeyValueCompare &comp)
401
- : KeyValueCompare(comp)
401
+ BOOST_CONTAINER_FORCEINLINE explicit key_node_compare(const KeyCompare &comp)
402
+ : base_t(comp)
402
403
  {}
403
404
 
404
- template<class T>
405
- struct is_node
406
- {
407
- static const bool value = is_same<T, Node>::value;
408
- };
409
-
410
- template<class T>
411
- typename enable_if_c<is_node<T>::value, const typename KeyValueCompare::value_type &>::type
412
- key_forward(const T &node) const
413
- { return node.get_data(); }
414
-
415
- template<class T>
416
- #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
417
- const T &key_forward(const T &key, typename enable_if_c<!is_node<T>::value>::type* =0) const
418
- #else
419
- typename enable_if_c<!is_node<T>::value, const T &>::type key_forward(const T &key) const
420
- #endif
421
- { return key; }
422
-
423
- template<class KeyType, class KeyType2>
424
- bool operator()(const KeyType &key1, const KeyType2 &key2) const
425
- { return KeyValueCompare::operator()(this->key_forward(key1), this->key_forward(key2)); }
405
+ typedef boost::intrusive::detail::ebo_functor_holder<KeyCompare> base_t;
406
+ typedef KeyCompare key_compare;
407
+ typedef KeyOfValue key_of_value;
408
+ typedef typename KeyOfValue::type key_type;
409
+
410
+ BOOST_CONTAINER_FORCEINLINE const key_compare &key_comp() const
411
+ { return static_cast<const key_compare &>(*this); }
412
+
413
+ BOOST_CONTAINER_FORCEINLINE key_compare &key_comp()
414
+ { return static_cast<key_compare &>(*this); }
415
+
416
+ BOOST_CONTAINER_FORCEINLINE bool operator()(const key_type &key1, const key_type &key2) const
417
+ { return this->key_comp()(key1, key2); }
418
+
419
+ template<class U>
420
+ BOOST_CONTAINER_FORCEINLINE bool operator()(const key_type &key1, const U &nonkey2) const
421
+ { return this->key_comp()(key1, key_of_value()(nonkey2.get_data())); }
422
+
423
+ template<class U>
424
+ BOOST_CONTAINER_FORCEINLINE bool operator()(const U &nonkey1, const key_type &key2) const
425
+ { return this->key_comp()(key_of_value()(nonkey1.get_data()), key2); }
426
+
427
+ template<class U, class V>
428
+ BOOST_CONTAINER_FORCEINLINE bool operator()(const U &nonkey1, const V &nonkey2) const
429
+ { return this->key_comp()(key_of_value()(nonkey1.get_data()), key_of_value()(nonkey2.get_data())); }
426
430
  };
427
431
 
428
- template <class Key, class T, class KeyOfValue,
432
+ template <class T, class KeyOfValue,
429
433
  class Compare, class Allocator,
430
434
  class Options = tree_assoc_defaults>
431
435
  class tree
432
- : protected container_detail::node_alloc_holder
436
+ : public container_detail::node_alloc_holder
433
437
  < Allocator
434
438
  , typename container_detail::intrusive_tree_type
435
- < Allocator, tree_value_compare<Key, T, Compare, KeyOfValue> //ValComp
439
+ < Allocator, tree_value_compare
440
+ <typename allocator_traits<Allocator>::pointer, Compare, KeyOfValue>
436
441
  , Options::tree_type, Options::optimize_size>::type
437
442
  >
438
443
  {
439
444
  typedef tree_value_compare
440
- <Key, T, Compare, KeyOfValue> ValComp;
445
+ < typename allocator_traits<Allocator>::pointer
446
+ , Compare, KeyOfValue> ValComp;
441
447
  typedef typename container_detail::intrusive_tree_type
442
448
  < Allocator, ValComp, Options::tree_type
443
449
  , Options::optimize_size>::type Icont;
444
450
  typedef container_detail::node_alloc_holder
445
451
  <Allocator, Icont> AllocHolder;
446
452
  typedef typename AllocHolder::NodePtr NodePtr;
447
- typedef tree < Key, T, KeyOfValue
453
+ typedef tree < T, KeyOfValue
448
454
  , Compare, Allocator, Options> ThisType;
449
455
  typedef typename AllocHolder::NodeAlloc NodeAlloc;
450
456
  typedef boost::container::
@@ -461,7 +467,7 @@ class tree
461
467
 
462
468
  public:
463
469
 
464
- typedef Key key_type;
470
+ typedef typename KeyOfValue::type key_type;
465
471
  typedef T value_type;
466
472
  typedef Allocator allocator_type;
467
473
  typedef Compare key_compare;
@@ -478,32 +484,36 @@ class tree
478
484
  allocator_traits<Allocator>::size_type size_type;
479
485
  typedef typename boost::container::
480
486
  allocator_traits<Allocator>::difference_type difference_type;
481
- typedef difference_type tree_difference_type;
482
- typedef pointer tree_pointer;
483
- typedef const_pointer tree_const_pointer;
484
- typedef reference tree_reference;
485
- typedef const_reference tree_const_reference;
487
+ typedef container_detail::iterator_from_iiterator
488
+ <iiterator, false> iterator;
489
+ typedef container_detail::iterator_from_iiterator
490
+ <iiterator, true > const_iterator;
491
+ typedef boost::container::reverse_iterator
492
+ <iterator> reverse_iterator;
493
+ typedef boost::container::reverse_iterator
494
+ <const_iterator> const_reverse_iterator;
495
+ typedef node_handle
496
+ < Node, value_type, allocator_type, void> node_type;
497
+ typedef insert_return_type_base
498
+ <iterator, node_type> insert_return_type;
499
+
486
500
  typedef NodeAlloc stored_allocator_type;
487
501
 
488
502
  private:
489
503
 
490
- typedef key_node_compare<value_compare, Node> KeyNodeCompare;
504
+ typedef key_node_compare<key_compare, KeyOfValue> KeyNodeCompare;
491
505
 
492
506
  public:
493
- typedef container_detail::iterator_from_iiterator<iiterator, false> iterator;
494
- typedef container_detail::iterator_from_iiterator<iiterator, true > const_iterator;
495
- typedef boost::container::reverse_iterator<iterator> reverse_iterator;
496
- typedef boost::container::reverse_iterator<const_iterator> const_reverse_iterator;
497
507
 
498
- tree()
508
+ BOOST_CONTAINER_FORCEINLINE tree()
499
509
  : AllocHolder()
500
510
  {}
501
511
 
502
- explicit tree(const key_compare& comp, const allocator_type& a = allocator_type())
512
+ BOOST_CONTAINER_FORCEINLINE explicit tree(const key_compare& comp, const allocator_type& a = allocator_type())
503
513
  : AllocHolder(ValComp(comp), a)
504
514
  {}
505
515
 
506
- explicit tree(const allocator_type& a)
516
+ BOOST_CONTAINER_FORCEINLINE explicit tree(const allocator_type& a)
507
517
  : AllocHolder(a)
508
518
  {}
509
519
 
@@ -526,12 +536,12 @@ class tree
526
536
  const const_iterator end_it(this->cend());
527
537
  if(unique_insertion){
528
538
  for ( ; first != last; ++first){
529
- this->insert_unique(end_it, *first);
539
+ this->insert_unique_convertible(end_it, *first);
530
540
  }
531
541
  }
532
542
  else{
533
543
  for ( ; first != last; ++first){
534
- this->insert_equal(end_it, *first);
544
+ this->insert_equal_convertible(end_it, *first);
535
545
  }
536
546
  }
537
547
  }
@@ -555,7 +565,7 @@ class tree
555
565
  //for the constructor
556
566
  const const_iterator end_it(this->cend());
557
567
  for ( ; first != last; ++first){
558
- this->insert_unique(end_it, *first);
568
+ this->insert_unique_convertible(end_it, *first);
559
569
  }
560
570
  }
561
571
  else{
@@ -603,18 +613,19 @@ class tree
603
613
  , container_detail::push_back_functor<Node, Icont>(this->icont()));
604
614
  }
605
615
 
606
- tree(const tree& x)
616
+ BOOST_CONTAINER_FORCEINLINE tree(const tree& x)
607
617
  : AllocHolder(x.value_comp(), x)
608
618
  {
609
619
  this->icont().clone_from
610
620
  (x.icont(), typename AllocHolder::cloner(*this), Destroyer(this->node_alloc()));
611
621
  }
612
622
 
613
- tree(BOOST_RV_REF(tree) x)
623
+ BOOST_CONTAINER_FORCEINLINE tree(BOOST_RV_REF(tree) x)
624
+ BOOST_NOEXCEPT_IF(boost::container::container_detail::is_nothrow_move_constructible<Compare>::value)
614
625
  : AllocHolder(BOOST_MOVE_BASE(AllocHolder, x), x.value_comp())
615
626
  {}
616
627
 
617
- tree(const tree& x, const allocator_type &a)
628
+ BOOST_CONTAINER_FORCEINLINE tree(const tree& x, const allocator_type &a)
618
629
  : AllocHolder(x.value_comp(), a)
619
630
  {
620
631
  this->icont().clone_from
@@ -633,7 +644,7 @@ class tree
633
644
  }
634
645
  }
635
646
 
636
- ~tree()
647
+ BOOST_CONTAINER_FORCEINLINE ~tree()
637
648
  {} //AllocHolder clears the tree
638
649
 
639
650
  tree& operator=(BOOST_COPY_ASSIGN_REF(tree) x)
@@ -668,8 +679,9 @@ class tree
668
679
  }
669
680
 
670
681
  tree& operator=(BOOST_RV_REF(tree) x)
671
- BOOST_NOEXCEPT_IF( allocator_traits_type::is_always_equal::value
672
- && boost::container::container_detail::is_nothrow_move_assignable<Compare>::value )
682
+ BOOST_NOEXCEPT_IF( (allocator_traits_type::propagate_on_container_move_assignment::value ||
683
+ allocator_traits_type::is_always_equal::value) &&
684
+ boost::container::container_detail::is_nothrow_move_assignable<Compare>::value)
673
685
  {
674
686
  BOOST_ASSERT(this != &x);
675
687
  NodeAlloc &this_alloc = this->node_alloc();
@@ -711,43 +723,43 @@ class tree
711
723
 
712
724
  public:
713
725
  // accessors:
714
- value_compare value_comp() const
726
+ BOOST_CONTAINER_FORCEINLINE value_compare value_comp() const
715
727
  { return this->icont().value_comp().predicate(); }
716
728
 
717
- key_compare key_comp() const
729
+ BOOST_CONTAINER_FORCEINLINE key_compare key_comp() const
718
730
  { return this->icont().value_comp().predicate().key_comp(); }
719
731
 
720
- allocator_type get_allocator() const
732
+ BOOST_CONTAINER_FORCEINLINE allocator_type get_allocator() const
721
733
  { return allocator_type(this->node_alloc()); }
722
734
 
723
- const stored_allocator_type &get_stored_allocator() const
735
+ BOOST_CONTAINER_FORCEINLINE const stored_allocator_type &get_stored_allocator() const
724
736
  { return this->node_alloc(); }
725
737
 
726
- stored_allocator_type &get_stored_allocator()
738
+ BOOST_CONTAINER_FORCEINLINE stored_allocator_type &get_stored_allocator()
727
739
  { return this->node_alloc(); }
728
740
 
729
- iterator begin()
741
+ BOOST_CONTAINER_FORCEINLINE iterator begin()
730
742
  { return iterator(this->icont().begin()); }
731
743
 
732
- const_iterator begin() const
744
+ BOOST_CONTAINER_FORCEINLINE const_iterator begin() const
733
745
  { return this->cbegin(); }
734
746
 
735
- iterator end()
747
+ BOOST_CONTAINER_FORCEINLINE iterator end()
736
748
  { return iterator(this->icont().end()); }
737
749
 
738
- const_iterator end() const
750
+ BOOST_CONTAINER_FORCEINLINE const_iterator end() const
739
751
  { return this->cend(); }
740
752
 
741
- reverse_iterator rbegin()
753
+ BOOST_CONTAINER_FORCEINLINE reverse_iterator rbegin()
742
754
  { return reverse_iterator(end()); }
743
755
 
744
- const_reverse_iterator rbegin() const
756
+ BOOST_CONTAINER_FORCEINLINE const_reverse_iterator rbegin() const
745
757
  { return this->crbegin(); }
746
758
 
747
- reverse_iterator rend()
759
+ BOOST_CONTAINER_FORCEINLINE reverse_iterator rend()
748
760
  { return reverse_iterator(begin()); }
749
761
 
750
- const_reverse_iterator rend() const
762
+ BOOST_CONTAINER_FORCEINLINE const_reverse_iterator rend() const
751
763
  { return this->crend(); }
752
764
 
753
765
  //! <b>Effects</b>: Returns a const_iterator to the first element contained in the container.
@@ -755,7 +767,7 @@ class tree
755
767
  //! <b>Throws</b>: Nothing.
756
768
  //!
757
769
  //! <b>Complexity</b>: Constant.
758
- const_iterator cbegin() const
770
+ BOOST_CONTAINER_FORCEINLINE const_iterator cbegin() const
759
771
  { return const_iterator(this->non_const_icont().begin()); }
760
772
 
761
773
  //! <b>Effects</b>: Returns a const_iterator to the end of the container.
@@ -763,7 +775,7 @@ class tree
763
775
  //! <b>Throws</b>: Nothing.
764
776
  //!
765
777
  //! <b>Complexity</b>: Constant.
766
- const_iterator cend() const
778
+ BOOST_CONTAINER_FORCEINLINE const_iterator cend() const
767
779
  { return const_iterator(this->non_const_icont().end()); }
768
780
 
769
781
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the beginning
@@ -772,7 +784,7 @@ class tree
772
784
  //! <b>Throws</b>: Nothing.
773
785
  //!
774
786
  //! <b>Complexity</b>: Constant.
775
- const_reverse_iterator crbegin() const
787
+ BOOST_CONTAINER_FORCEINLINE const_reverse_iterator crbegin() const
776
788
  { return const_reverse_iterator(cend()); }
777
789
 
778
790
  //! <b>Effects</b>: Returns a const_reverse_iterator pointing to the end
@@ -781,19 +793,19 @@ class tree
781
793
  //! <b>Throws</b>: Nothing.
782
794
  //!
783
795
  //! <b>Complexity</b>: Constant.
784
- const_reverse_iterator crend() const
796
+ BOOST_CONTAINER_FORCEINLINE const_reverse_iterator crend() const
785
797
  { return const_reverse_iterator(cbegin()); }
786
798
 
787
- bool empty() const
799
+ BOOST_CONTAINER_FORCEINLINE bool empty() const
788
800
  { return !this->size(); }
789
801
 
790
- size_type size() const
802
+ BOOST_CONTAINER_FORCEINLINE size_type size() const
791
803
  { return this->icont().size(); }
792
804
 
793
- size_type max_size() const
805
+ BOOST_CONTAINER_FORCEINLINE size_type max_size() const
794
806
  { return AllocHolder::max_size(); }
795
807
 
796
- void swap(ThisType& x)
808
+ BOOST_CONTAINER_FORCEINLINE void swap(ThisType& x)
797
809
  BOOST_NOEXCEPT_IF( allocator_traits_type::is_always_equal::value
798
810
  && boost::container::container_detail::is_nothrow_swappable<Compare>::value )
799
811
  { AllocHolder::swap(x); }
@@ -807,7 +819,7 @@ class tree
807
819
  (const key_type& key, insert_commit_data &data)
808
820
  {
809
821
  std::pair<iiterator, bool> ret =
810
- this->icont().insert_unique_check(key, KeyNodeCompare(value_comp()), data);
822
+ this->icont().insert_unique_check(key, KeyNodeCompare(key_comp()), data);
811
823
  return std::pair<iterator, bool>(iterator(ret.first), ret.second);
812
824
  }
813
825
 
@@ -816,19 +828,10 @@ class tree
816
828
  {
817
829
  BOOST_ASSERT((priv_is_linked)(hint));
818
830
  std::pair<iiterator, bool> ret =
819
- this->icont().insert_unique_check(hint.get(), key, KeyNodeCompare(value_comp()), data);
831
+ this->icont().insert_unique_check(hint.get(), key, KeyNodeCompare(key_comp()), data);
820
832
  return std::pair<iterator, bool>(iterator(ret.first), ret.second);
821
833
  }
822
834
 
823
- iterator insert_unique_commit(const value_type& v, insert_commit_data &data)
824
- {
825
- NodePtr tmp = AllocHolder::create_node(v);
826
- scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
827
- iterator ret(this->icont().insert_unique_commit(*tmp, data));
828
- destroy_deallocator.release();
829
- return ret;
830
- }
831
-
832
835
  template<class MovableConvertible>
833
836
  iterator insert_unique_commit
834
837
  (BOOST_FWD_REF(MovableConvertible) v, insert_commit_data &data)
@@ -840,17 +843,6 @@ class tree
840
843
  return ret;
841
844
  }
842
845
 
843
- std::pair<iterator,bool> insert_unique(const value_type& v)
844
- {
845
- insert_commit_data data;
846
- std::pair<iterator,bool> ret =
847
- this->insert_unique_check(KeyOfValue()(v), data);
848
- if(ret.second){
849
- ret.first = this->insert_unique_commit(v, data);
850
- }
851
- return ret;
852
- }
853
-
854
846
  template<class MovableConvertible>
855
847
  std::pair<iterator,bool> insert_unique(BOOST_FWD_REF(MovableConvertible) v)
856
848
  {
@@ -865,6 +857,17 @@ class tree
865
857
 
866
858
  private:
867
859
 
860
+ template<class KeyConvertible, class M>
861
+ iiterator priv_insert_or_assign_commit
862
+ (BOOST_FWD_REF(KeyConvertible) key, BOOST_FWD_REF(M) obj, insert_commit_data &data)
863
+ {
864
+ NodePtr tmp = AllocHolder::create_node(boost::forward<KeyConvertible>(key), boost::forward<M>(obj));
865
+ scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
866
+ iiterator ret(this->icont().insert_unique_commit(*tmp, data));
867
+ destroy_deallocator.release();
868
+ return ret;
869
+ }
870
+
868
871
  bool priv_is_linked(const_iterator const position) const
869
872
  {
870
873
  iiterator const cur(position.get());
@@ -895,7 +898,7 @@ class tree
895
898
  //No throw insertion part, release rollback
896
899
  destroy_deallocator.release();
897
900
  return std::pair<iterator,bool>
898
- ( iterator(iiterator(this->icont().insert_unique_commit(*p, data)))
901
+ ( iterator(this->icont().insert_unique_commit(*p, data))
899
902
  , true );
900
903
  }
901
904
 
@@ -910,7 +913,7 @@ class tree
910
913
  Destroyer(this->node_alloc())(p);
911
914
  return ret.first;
912
915
  }
913
- return iterator(iiterator(this->icont().insert_unique_commit(*p, data)));
916
+ return iterator(this->icont().insert_unique_commit(*p, data));
914
917
  }
915
918
 
916
919
  public:
@@ -918,11 +921,11 @@ class tree
918
921
  #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
919
922
 
920
923
  template <class... Args>
921
- std::pair<iterator, bool> emplace_unique(BOOST_FWD_REF(Args)... args)
924
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> emplace_unique(BOOST_FWD_REF(Args)... args)
922
925
  { return this->emplace_unique_impl(AllocHolder::create_node(boost::forward<Args>(args)...)); }
923
926
 
924
927
  template <class... Args>
925
- iterator emplace_hint_unique(const_iterator hint, BOOST_FWD_REF(Args)... args)
928
+ BOOST_CONTAINER_FORCEINLINE iterator emplace_hint_unique(const_iterator hint, BOOST_FWD_REF(Args)... args)
926
929
  { return this->emplace_unique_hint_impl(hint, AllocHolder::create_node(boost::forward<Args>(args)...)); }
927
930
 
928
931
  template <class... Args>
@@ -946,6 +949,22 @@ class tree
946
949
  return ret;
947
950
  }
948
951
 
952
+ template <class KeyType, class... Args>
953
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> try_emplace
954
+ (const_iterator hint, BOOST_FWD_REF(KeyType) key, BOOST_FWD_REF(Args)... args)
955
+ {
956
+ insert_commit_data data;
957
+ const key_type & k = key; //Support emulated rvalue references
958
+ std::pair<iiterator, bool> ret =
959
+ hint == const_iterator() ? this->icont().insert_unique_check( k, KeyNodeCompare(key_comp()), data)
960
+ : this->icont().insert_unique_check(hint.get(), k, KeyNodeCompare(key_comp()), data);
961
+ if(ret.second){
962
+ ret.first = this->icont().insert_unique_commit
963
+ (*AllocHolder::create_node(try_emplace_t(), boost::forward<KeyType>(key), boost::forward<Args>(args)...), data);
964
+ }
965
+ return std::pair<iterator, bool>(iterator(ret.first), ret.second);
966
+ }
967
+
949
968
  #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
950
969
 
951
970
  #define BOOST_CONTAINER_TREE_EMPLACE_CODE(N) \
@@ -977,25 +996,30 @@ class tree
977
996
  destroy_deallocator.release();\
978
997
  return ret;\
979
998
  }\
999
+ \
1000
+ template <class KeyType BOOST_MOVE_I##N BOOST_MOVE_CLASS##N>\
1001
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool>\
1002
+ try_emplace(const_iterator hint, BOOST_FWD_REF(KeyType) key BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
1003
+ {\
1004
+ insert_commit_data data;\
1005
+ const key_type & k = key;\
1006
+ std::pair<iiterator, bool> ret =\
1007
+ hint == const_iterator() ? this->icont().insert_unique_check( k, KeyNodeCompare(key_comp()), data)\
1008
+ : this->icont().insert_unique_check(hint.get(), k, KeyNodeCompare(key_comp()), data);\
1009
+ if(ret.second){\
1010
+ ret.first = this->icont().insert_unique_commit\
1011
+ (*AllocHolder::create_node(try_emplace_t(), boost::forward<KeyType>(key) BOOST_MOVE_I##N BOOST_MOVE_FWD##N), data);\
1012
+ }\
1013
+ return std::pair<iterator, bool>(iterator(ret.first), ret.second);\
1014
+ }\
980
1015
  //
981
1016
  BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_TREE_EMPLACE_CODE)
982
1017
  #undef BOOST_CONTAINER_TREE_EMPLACE_CODE
983
1018
 
984
1019
  #endif // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
985
1020
 
986
- iterator insert_unique(const_iterator hint, const value_type& v)
987
- {
988
- BOOST_ASSERT((priv_is_linked)(hint));
989
- insert_commit_data data;
990
- std::pair<iterator,bool> ret =
991
- this->insert_unique_check(hint, KeyOfValue()(v), data);
992
- if(!ret.second)
993
- return ret.first;
994
- return this->insert_unique_commit(v, data);
995
- }
996
-
997
1021
  template<class MovableConvertible>
998
- iterator insert_unique(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
1022
+ iterator insert_unique_convertible(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
999
1023
  {
1000
1024
  BOOST_ASSERT((priv_is_linked)(hint));
1001
1025
  insert_commit_data data;
@@ -1006,6 +1030,8 @@ class tree
1006
1030
  return this->insert_unique_commit(boost::forward<MovableConvertible>(v), data);
1007
1031
  }
1008
1032
 
1033
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(insert_unique, value_type, iterator, this->insert_unique_convertible, const_iterator, const_iterator)
1034
+
1009
1035
  template <class InputIterator>
1010
1036
  void insert_unique(InputIterator first, InputIterator last)
1011
1037
  {
@@ -1032,18 +1058,8 @@ class tree
1032
1058
  return ret;
1033
1059
  }
1034
1060
 
1035
- iterator insert_equal(const_iterator hint, const value_type& v)
1036
- {
1037
- BOOST_ASSERT((priv_is_linked)(hint));
1038
- NodePtr tmp(AllocHolder::create_node(v));
1039
- scoped_destroy_deallocator<NodeAlloc> destroy_deallocator(tmp, this->node_alloc());
1040
- iterator ret(this->icont().insert_equal(hint.get(), *tmp));
1041
- destroy_deallocator.release();
1042
- return ret;
1043
- }
1044
-
1045
1061
  template<class MovableConvertible>
1046
- iterator insert_equal(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
1062
+ iterator insert_equal_convertible(const_iterator hint, BOOST_FWD_REF(MovableConvertible) v)
1047
1063
  {
1048
1064
  BOOST_ASSERT((priv_is_linked)(hint));
1049
1065
  NodePtr tmp(AllocHolder::create_node(boost::forward<MovableConvertible>(v)));
@@ -1053,6 +1069,8 @@ class tree
1053
1069
  return ret;
1054
1070
  }
1055
1071
 
1072
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(insert_equal, value_type, iterator, this->insert_equal_convertible, const_iterator, const_iterator)
1073
+
1056
1074
  template <class InputIterator>
1057
1075
  void insert_equal(InputIterator first, InputIterator last)
1058
1076
  {
@@ -1060,14 +1078,31 @@ class tree
1060
1078
  this->insert_equal(*first);
1061
1079
  }
1062
1080
 
1081
+ template<class KeyType, class M>
1082
+ std::pair<iterator, bool> insert_or_assign(const_iterator hint, BOOST_FWD_REF(KeyType) key, BOOST_FWD_REF(M) obj)
1083
+ {
1084
+ insert_commit_data data;
1085
+ const key_type & k = key; //Support emulated rvalue references
1086
+ std::pair<iiterator, bool> ret =
1087
+ hint == const_iterator() ? this->icont().insert_unique_check(k, KeyNodeCompare(key_comp()), data)
1088
+ : this->icont().insert_unique_check(hint.get(), k, KeyNodeCompare(key_comp()), data);
1089
+ if(ret.second){
1090
+ ret.first = this->priv_insert_or_assign_commit(boost::forward<KeyType>(key), boost::forward<M>(obj), data);
1091
+ }
1092
+ else{
1093
+ ret.first->get_data().second = boost::forward<M>(obj);
1094
+ }
1095
+ return std::pair<iterator, bool>(iterator(ret.first), ret.second);
1096
+ }
1097
+
1063
1098
  iterator erase(const_iterator position)
1064
1099
  {
1065
1100
  BOOST_ASSERT(position != this->cend() && (priv_is_linked)(position));
1066
1101
  return iterator(this->icont().erase_and_dispose(position.get(), Destroyer(this->node_alloc())));
1067
1102
  }
1068
1103
 
1069
- size_type erase(const key_type& k)
1070
- { return AllocHolder::erase_key(k, KeyNodeCompare(value_comp()), alloc_version()); }
1104
+ BOOST_CONTAINER_FORCEINLINE size_type erase(const key_type& k)
1105
+ { return AllocHolder::erase_key(k, KeyNodeCompare(key_comp()), alloc_version()); }
1071
1106
 
1072
1107
  iterator erase(const_iterator first, const_iterator last)
1073
1108
  {
@@ -1076,43 +1111,117 @@ class tree
1076
1111
  return iterator(AllocHolder::erase_range(first.get(), last.get(), alloc_version()));
1077
1112
  }
1078
1113
 
1079
- void clear()
1114
+ node_type extract(const key_type& k)
1115
+ {
1116
+ iterator const it = this->find(k);
1117
+ if(this->end() != it){
1118
+ return this->extract(it);
1119
+ }
1120
+ return node_type();
1121
+ }
1122
+
1123
+ node_type extract(const_iterator position)
1124
+ {
1125
+ BOOST_ASSERT(position != this->cend() && (priv_is_linked)(position));
1126
+ iiterator const iit(position.get());
1127
+ this->icont().erase(iit);
1128
+ return node_type(iit.operator->(), this->node_alloc());
1129
+ }
1130
+
1131
+ insert_return_type insert_unique_node(BOOST_RV_REF_BEG_IF_CXX11 node_type BOOST_RV_REF_END_IF_CXX11 nh)
1132
+ {
1133
+ return this->insert_unique_node(this->end(), boost::move(nh));
1134
+ }
1135
+
1136
+ insert_return_type insert_unique_node(const_iterator hint, BOOST_RV_REF_BEG_IF_CXX11 node_type BOOST_RV_REF_END_IF_CXX11 nh)
1137
+ {
1138
+ insert_return_type irt; //inserted == false, node.empty()
1139
+ if(!nh.empty()){
1140
+ insert_commit_data data;
1141
+ std::pair<iterator,bool> ret =
1142
+ this->insert_unique_check(hint, KeyOfValue()(nh.value()), data);
1143
+ if(ret.second){
1144
+ irt.inserted = true;
1145
+ irt.position = iterator(this->icont().insert_unique_commit(*nh.get_node_pointer(), data));
1146
+ nh.release();
1147
+ }
1148
+ else{
1149
+ irt.position = ret.first;
1150
+ irt.node = boost::move(nh);
1151
+ }
1152
+ }
1153
+ else{
1154
+ irt.position = this->end();
1155
+ }
1156
+ return BOOST_MOVE_RET(insert_return_type, irt);
1157
+ }
1158
+
1159
+ iterator insert_equal_node(BOOST_RV_REF_BEG_IF_CXX11 node_type BOOST_RV_REF_END_IF_CXX11 nh)
1160
+ {
1161
+ if(nh.empty()){
1162
+ return this->end();
1163
+ }
1164
+ else{
1165
+ NodePtr const p(nh.release());
1166
+ return iterator(this->icont().insert_equal(*p));
1167
+ }
1168
+ }
1169
+
1170
+ iterator insert_equal_node(const_iterator hint, BOOST_RV_REF_BEG_IF_CXX11 node_type BOOST_RV_REF_END_IF_CXX11 nh)
1171
+ {
1172
+ if(nh.empty()){
1173
+ return this->end();
1174
+ }
1175
+ else{
1176
+ NodePtr const p(nh.release());
1177
+ return iterator(this->icont().insert_equal(hint.get(), *p));
1178
+ }
1179
+ }
1180
+
1181
+ template<class C2>
1182
+ BOOST_CONTAINER_FORCEINLINE void merge_unique(tree<T, KeyOfValue, C2, Allocator, Options>& source)
1183
+ { return this->icont().merge_unique(source.icont()); }
1184
+
1185
+ template<class C2>
1186
+ BOOST_CONTAINER_FORCEINLINE void merge_equal(tree<T, KeyOfValue, C2, Allocator, Options>& source)
1187
+ { return this->icont().merge_equal(source.icont()); }
1188
+ BOOST_CONTAINER_FORCEINLINE void clear()
1080
1189
  { AllocHolder::clear(alloc_version()); }
1081
1190
 
1082
1191
  // search operations. Const and non-const overloads even if no iterator is returned
1083
1192
  // so splay implementations can to their rebalancing when searching in non-const versions
1084
- iterator find(const key_type& k)
1085
- { return iterator(this->icont().find(k, KeyNodeCompare(value_comp()))); }
1193
+ BOOST_CONTAINER_FORCEINLINE iterator find(const key_type& k)
1194
+ { return iterator(this->icont().find(k, KeyNodeCompare(key_comp()))); }
1086
1195
 
1087
- const_iterator find(const key_type& k) const
1088
- { return const_iterator(this->non_const_icont().find(k, KeyNodeCompare(value_comp()))); }
1196
+ BOOST_CONTAINER_FORCEINLINE const_iterator find(const key_type& k) const
1197
+ { return const_iterator(this->non_const_icont().find(k, KeyNodeCompare(key_comp()))); }
1089
1198
 
1090
- size_type count(const key_type& k) const
1091
- { return size_type(this->icont().count(k, KeyNodeCompare(value_comp()))); }
1199
+ BOOST_CONTAINER_FORCEINLINE size_type count(const key_type& k) const
1200
+ { return size_type(this->icont().count(k, KeyNodeCompare(key_comp()))); }
1092
1201
 
1093
- iterator lower_bound(const key_type& k)
1094
- { return iterator(this->icont().lower_bound(k, KeyNodeCompare(value_comp()))); }
1202
+ BOOST_CONTAINER_FORCEINLINE iterator lower_bound(const key_type& k)
1203
+ { return iterator(this->icont().lower_bound(k, KeyNodeCompare(key_comp()))); }
1095
1204
 
1096
- const_iterator lower_bound(const key_type& k) const
1097
- { return const_iterator(this->non_const_icont().lower_bound(k, KeyNodeCompare(value_comp()))); }
1205
+ BOOST_CONTAINER_FORCEINLINE const_iterator lower_bound(const key_type& k) const
1206
+ { return const_iterator(this->non_const_icont().lower_bound(k, KeyNodeCompare(key_comp()))); }
1098
1207
 
1099
- iterator upper_bound(const key_type& k)
1100
- { return iterator(this->icont().upper_bound(k, KeyNodeCompare(value_comp()))); }
1208
+ BOOST_CONTAINER_FORCEINLINE iterator upper_bound(const key_type& k)
1209
+ { return iterator(this->icont().upper_bound(k, KeyNodeCompare(key_comp()))); }
1101
1210
 
1102
- const_iterator upper_bound(const key_type& k) const
1103
- { return const_iterator(this->non_const_icont().upper_bound(k, KeyNodeCompare(value_comp()))); }
1211
+ BOOST_CONTAINER_FORCEINLINE const_iterator upper_bound(const key_type& k) const
1212
+ { return const_iterator(this->non_const_icont().upper_bound(k, KeyNodeCompare(key_comp()))); }
1104
1213
 
1105
1214
  std::pair<iterator,iterator> equal_range(const key_type& k)
1106
1215
  {
1107
1216
  std::pair<iiterator, iiterator> ret =
1108
- this->icont().equal_range(k, KeyNodeCompare(value_comp()));
1217
+ this->icont().equal_range(k, KeyNodeCompare(key_comp()));
1109
1218
  return std::pair<iterator,iterator>(iterator(ret.first), iterator(ret.second));
1110
1219
  }
1111
1220
 
1112
1221
  std::pair<const_iterator, const_iterator> equal_range(const key_type& k) const
1113
1222
  {
1114
1223
  std::pair<iiterator, iiterator> ret =
1115
- this->non_const_icont().equal_range(k, KeyNodeCompare(value_comp()));
1224
+ this->non_const_icont().equal_range(k, KeyNodeCompare(key_comp()));
1116
1225
  return std::pair<const_iterator,const_iterator>
1117
1226
  (const_iterator(ret.first), const_iterator(ret.second));
1118
1227
  }
@@ -1120,40 +1229,40 @@ class tree
1120
1229
  std::pair<iterator,iterator> lower_bound_range(const key_type& k)
1121
1230
  {
1122
1231
  std::pair<iiterator, iiterator> ret =
1123
- this->icont().lower_bound_range(k, KeyNodeCompare(value_comp()));
1232
+ this->icont().lower_bound_range(k, KeyNodeCompare(key_comp()));
1124
1233
  return std::pair<iterator,iterator>(iterator(ret.first), iterator(ret.second));
1125
1234
  }
1126
1235
 
1127
1236
  std::pair<const_iterator, const_iterator> lower_bound_range(const key_type& k) const
1128
1237
  {
1129
1238
  std::pair<iiterator, iiterator> ret =
1130
- this->non_const_icont().lower_bound_range(k, KeyNodeCompare(value_comp()));
1239
+ this->non_const_icont().lower_bound_range(k, KeyNodeCompare(key_comp()));
1131
1240
  return std::pair<const_iterator,const_iterator>
1132
1241
  (const_iterator(ret.first), const_iterator(ret.second));
1133
1242
  }
1134
1243
 
1135
- void rebalance()
1244
+ BOOST_CONTAINER_FORCEINLINE void rebalance()
1136
1245
  { intrusive_tree_proxy_t::rebalance(this->icont()); }
1137
1246
 
1138
- friend bool operator==(const tree& x, const tree& y)
1247
+ BOOST_CONTAINER_FORCEINLINE friend bool operator==(const tree& x, const tree& y)
1139
1248
  { return x.size() == y.size() && ::boost::container::algo_equal(x.begin(), x.end(), y.begin()); }
1140
1249
 
1141
- friend bool operator<(const tree& x, const tree& y)
1250
+ BOOST_CONTAINER_FORCEINLINE friend bool operator<(const tree& x, const tree& y)
1142
1251
  { return ::boost::container::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); }
1143
1252
 
1144
- friend bool operator!=(const tree& x, const tree& y)
1253
+ BOOST_CONTAINER_FORCEINLINE friend bool operator!=(const tree& x, const tree& y)
1145
1254
  { return !(x == y); }
1146
1255
 
1147
- friend bool operator>(const tree& x, const tree& y)
1256
+ BOOST_CONTAINER_FORCEINLINE friend bool operator>(const tree& x, const tree& y)
1148
1257
  { return y < x; }
1149
1258
 
1150
- friend bool operator<=(const tree& x, const tree& y)
1259
+ BOOST_CONTAINER_FORCEINLINE friend bool operator<=(const tree& x, const tree& y)
1151
1260
  { return !(y < x); }
1152
1261
 
1153
- friend bool operator>=(const tree& x, const tree& y)
1262
+ BOOST_CONTAINER_FORCEINLINE friend bool operator>=(const tree& x, const tree& y)
1154
1263
  { return !(x < y); }
1155
1264
 
1156
- friend void swap(tree& x, tree& y)
1265
+ BOOST_CONTAINER_FORCEINLINE friend void swap(tree& x, tree& y)
1157
1266
  { x.swap(y); }
1158
1267
  };
1159
1268
 
@@ -1165,11 +1274,11 @@ struct has_trivial_destructor_after_move;
1165
1274
 
1166
1275
  //!has_trivial_destructor_after_move<> == true_type
1167
1276
  //!specialization for optimizations
1168
- template <class Key, class T, class KeyOfValue, class Compare, class Allocator, class Options>
1277
+ template <class T, class KeyOfValue, class Compare, class Allocator, class Options>
1169
1278
  struct has_trivial_destructor_after_move
1170
1279
  <
1171
1280
  ::boost::container::container_detail::tree
1172
- <Key, T, KeyOfValue, Compare, Allocator, Options>
1281
+ <T, KeyOfValue, Compare, Allocator, Options>
1173
1282
  >
1174
1283
  {
1175
1284
  typedef typename ::boost::container::allocator_traits<Allocator>::pointer pointer;