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
@@ -37,6 +37,8 @@ struct value_init
37
37
 
38
38
  operator T &() { return m_t; }
39
39
 
40
+ T &get() { return m_t; }
41
+
40
42
  T m_t;
41
43
  };
42
44
 
@@ -21,6 +21,7 @@
21
21
 
22
22
  #include <boost/container/detail/config_begin.hpp>
23
23
  #include <boost/container/detail/workaround.hpp>
24
+ #include <boost/move/utility_core.hpp>
24
25
 
25
26
  #include <boost/container/detail/type_traits.hpp>
26
27
  #include <cstddef> //std::size_t
@@ -42,13 +43,13 @@ class tuple<Head, Tail...>
42
43
  typedef tuple<Tail...> inherited;
43
44
 
44
45
  public:
45
- tuple() { }
46
+ tuple()
47
+ : inherited(), m_head()
48
+ {}
46
49
 
47
- // implicit copy-constructor is okay
48
- // Construct tuple from separate arguments.
49
- tuple(typename add_const_reference<Head>::type v,
50
- typename add_const_reference<Tail>::type... vtail)
51
- : inherited(vtail...), m_head(v)
50
+ template<class U, class ...Args>
51
+ tuple(U &&u, Args && ...args)
52
+ : inherited(::boost::forward<Args>(args)...), m_head(::boost::forward<U>(u))
52
53
  {}
53
54
 
54
55
  // Construct tuple from another tuple.
@@ -77,8 +78,8 @@ class tuple<Head, Tail...>
77
78
 
78
79
 
79
80
  template<typename... Values>
80
- tuple<Values&&...> tie_forward(Values&&... values)
81
- { return tuple<Values&&...>(values...); }
81
+ tuple<Values&&...> forward_as_tuple(Values&&... values)
82
+ { return tuple<Values&&...>(::boost::forward<Values>(values)...); }
82
83
 
83
84
  template<int I, typename Tuple>
84
85
  struct tuple_element;
@@ -135,21 +136,25 @@ typename get_impl<I, tuple<Values...> >::const_type get(const tuple<Values...>&
135
136
  // in a function call.
136
137
  ////////////////////////////////////////////////////
137
138
 
138
- template<int... Indexes>
139
- struct index_tuple{};
139
+ template<std::size_t...> struct index_tuple{ typedef index_tuple type; };
140
140
 
141
- template<std::size_t Num, typename Tuple = index_tuple<> >
142
- struct build_number_seq;
141
+ template<class S1, class S2> struct concat_index_tuple;
143
142
 
144
- template<std::size_t Num, int... Indexes>
145
- struct build_number_seq<Num, index_tuple<Indexes...> >
146
- : build_number_seq<Num - 1, index_tuple<Indexes..., sizeof...(Indexes)> >
147
- {};
143
+ template<std::size_t... I1, std::size_t... I2>
144
+ struct concat_index_tuple<index_tuple<I1...>, index_tuple<I2...>>
145
+ : index_tuple<I1..., (sizeof...(I1)+I2)...>{};
148
146
 
149
- template<int... Indexes>
150
- struct build_number_seq<0, index_tuple<Indexes...> >
151
- { typedef index_tuple<Indexes...> type; };
147
+ template<std::size_t N> struct build_number_seq;
148
+
149
+ template<std::size_t N>
150
+ struct build_number_seq
151
+ : concat_index_tuple<typename build_number_seq<N/2>::type
152
+ ,typename build_number_seq<N - N/2 >::type
153
+ >::type
154
+ {};
152
155
 
156
+ template<> struct build_number_seq<0> : index_tuple<>{};
157
+ template<> struct build_number_seq<1> : index_tuple<0>{};
153
158
 
154
159
  }}} //namespace boost { namespace container { namespace container_detail {
155
160
 
@@ -29,12 +29,34 @@
29
29
  #define BOOST_CONTAINER_UNIMPLEMENTED_PACK_EXPANSION_TO_FIXED_LIST
30
30
  #endif
31
31
 
32
+ #if defined(BOOST_GCC_VERSION)
33
+ # if (BOOST_GCC_VERSION < 40700) || !defined(BOOST_GCC_CXX11)
34
+ # define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS
35
+ # endif
36
+ #elif defined(BOOST_MSVC)
37
+ # if _MSC_FULL_VER < 180020827
38
+ # define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS
39
+ # endif
40
+ #elif defined(BOOST_CLANG)
41
+ # if !__has_feature(cxx_delegating_constructors)
42
+ # define BOOST_CONTAINER_NO_CXX11_DELEGATING_CONSTRUCTORS
43
+ # endif
44
+ #endif
45
+
32
46
  #if !defined(BOOST_FALLTHOUGH)
33
47
  #define BOOST_CONTAINER_FALLTHOUGH
34
48
  #else
35
49
  #define BOOST_CONTAINER_FALLTHOUGH BOOST_FALLTHOUGH;
36
50
  #endif
37
51
 
52
+ #if defined(BOOST_MSVC) && (_MSC_VER < 1400)
53
+ #define BOOST_CONTAINER_TEMPLATED_CONVERSION_OPERATOR_BROKEN
54
+ #endif
55
+
56
+ #if !defined(BOOST_NO_CXX11_HDR_TUPLE) || (defined(BOOST_MSVC) && (BOOST_MSVC == 1700 || BOOST_MSVC == 1600))
57
+ #define BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE
58
+ #endif
59
+
38
60
  //Macros for documentation purposes. For code, expands to the argument
39
61
  #define BOOST_CONTAINER_IMPDEF(TYPE) TYPE
40
62
  #define BOOST_CONTAINER_SEEDOC(TYPE) TYPE
@@ -76,4 +98,20 @@
76
98
  #define BOOST_CONTAINER_DECL
77
99
  #endif /* DYN_LINK */
78
100
 
101
+ //#define BOOST_CONTAINER_DISABLE_FORCEINLINE
102
+
103
+ #if defined(BOOST_CONTAINER_DISABLE_FORCEINLINE)
104
+ #define BOOST_CONTAINER_FORCEINLINE inline
105
+ #elif defined(BOOST_CONTAINER_FORCEINLINE_IS_BOOST_FORCELINE)
106
+ #define BOOST_CONTAINER_FORCEINLINE BOOST_FORCEINLINE
107
+ #elif defined(BOOST_MSVC) && defined(_DEBUG)
108
+ //"__forceinline" and MSVC seems to have some bugs in debug mode
109
+ #define BOOST_CONTAINER_FORCEINLINE inline
110
+ #elif defined(__GNUC__) && ((__GNUC__ < 4) || (__GNUC__ == 4 && (__GNUC_MINOR__ < 5)))
111
+ //Older GCCs have problems with forceinline
112
+ #define BOOST_CONTAINER_FORCEINLINE inline
113
+ #else
114
+ #define BOOST_CONTAINER_FORCEINLINE BOOST_FORCEINLINE
115
+ #endif
116
+
79
117
  #endif //#ifndef BOOST_CONTAINER_DETAIL_WORKAROUND_HPP
@@ -53,14 +53,17 @@ namespace container {
53
53
 
54
54
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
55
55
 
56
+ template <class Key, class T, class Compare, class Allocator>
57
+ class flat_multimap;
58
+
56
59
  namespace container_detail{
57
60
 
58
61
  template<class D, class S>
59
- static D &force(const S &s)
62
+ BOOST_CONTAINER_FORCEINLINE static D &force(const S &s)
60
63
  { return *const_cast<D*>((reinterpret_cast<const D*>(&s))); }
61
64
 
62
65
  template<class D, class S>
63
- static D force_copy(S s)
66
+ BOOST_CONTAINER_FORCEINLINE static D force_copy(S s)
64
67
  {
65
68
  D *vp = reinterpret_cast<D *>(&s);
66
69
  return D(*vp);
@@ -110,16 +113,16 @@ class flat_map
110
113
  private:
111
114
  BOOST_COPYABLE_AND_MOVABLE(flat_map)
112
115
  //This is the tree that we should store if pair was movable
113
- typedef container_detail::flat_tree<Key,
116
+ typedef container_detail::flat_tree<
114
117
  std::pair<Key, T>,
115
- container_detail::select1st< std::pair<Key, T> >,
118
+ container_detail::select1st<Key>,
116
119
  Compare,
117
120
  Allocator> tree_t;
118
121
 
119
122
  //This is the real tree stored here. It's based on a movable pair
120
- typedef container_detail::flat_tree<Key,
123
+ typedef container_detail::flat_tree<
121
124
  container_detail::pair<Key, T>,
122
- container_detail::select1st<container_detail::pair<Key, T> >,
125
+ container_detail::select1st<Key>,
123
126
  Compare,
124
127
  typename allocator_traits<Allocator>::template portable_rebind_alloc
125
128
  <container_detail::pair<Key, T> >::type> impl_tree_t;
@@ -131,7 +134,7 @@ class flat_map
131
134
  typedef typename impl_tree_t::allocator_type impl_allocator_type;
132
135
  typedef container_detail::flat_tree_value_compare
133
136
  < Compare
134
- , container_detail::select1st< std::pair<Key, T> >
137
+ , container_detail::select1st<Key>
135
138
  , std::pair<Key, T> > value_compare_impl;
136
139
  typedef typename container_detail::get_flat_tree_iterators
137
140
  <typename allocator_traits<Allocator>::pointer>::iterator iterator_impl;
@@ -143,6 +146,13 @@ class flat_map
143
146
  <typename allocator_traits<Allocator>::pointer>::const_reverse_iterator const_reverse_iterator_impl;
144
147
  public:
145
148
  typedef typename impl_tree_t::stored_allocator_type impl_stored_allocator_type;
149
+
150
+ impl_tree_t &tree()
151
+ { return m_flat_tree; }
152
+
153
+ const impl_tree_t &tree() const
154
+ { return m_flat_tree; }
155
+
146
156
  private:
147
157
  #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
148
158
 
@@ -183,10 +193,11 @@ class flat_map
183
193
  //! <b>Effects</b>: Default constructs an empty flat_map.
184
194
  //!
185
195
  //! <b>Complexity</b>: Constant.
186
- flat_map()
196
+ flat_map() BOOST_NOEXCEPT_IF(container_detail::is_nothrow_default_constructible<Allocator>::value &&
197
+ container_detail::is_nothrow_default_constructible<Compare>::value)
187
198
  : m_flat_tree()
188
199
  {
189
- //A type must be std::pair<Key, T>
200
+ //value_type must be std::pair<Key, T>
190
201
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
191
202
  }
192
203
 
@@ -197,7 +208,7 @@ class flat_map
197
208
  explicit flat_map(const Compare& comp, const allocator_type& a = allocator_type())
198
209
  : m_flat_tree(comp, container_detail::force<impl_allocator_type>(a))
199
210
  {
200
- //A type must be std::pair<Key, T>
211
+ //value_type must be std::pair<Key, T>
201
212
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
202
213
  }
203
214
 
@@ -207,7 +218,7 @@ class flat_map
207
218
  explicit flat_map(const allocator_type& a)
208
219
  : m_flat_tree(container_detail::force<impl_allocator_type>(a))
209
220
  {
210
- //A type must be std::pair<Key, T>
221
+ //value_type must be std::pair<Key, T>
211
222
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
212
223
  }
213
224
 
@@ -221,7 +232,7 @@ class flat_map
221
232
  const allocator_type& a = allocator_type())
222
233
  : m_flat_tree(true, first, last, comp, container_detail::force<impl_allocator_type>(a))
223
234
  {
224
- //A type must be std::pair<Key, T>
235
+ //value_type must be std::pair<Key, T>
225
236
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
226
237
  }
227
238
 
@@ -234,7 +245,7 @@ class flat_map
234
245
  flat_map(InputIterator first, InputIterator last, const allocator_type& a)
235
246
  : m_flat_tree(true, first, last, Compare(), container_detail::force<impl_allocator_type>(a))
236
247
  {
237
- //A type must be std::pair<Key, T>
248
+ //value_type must be std::pair<Key, T>
238
249
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
239
250
  }
240
251
 
@@ -251,9 +262,9 @@ class flat_map
251
262
  template <class InputIterator>
252
263
  flat_map( ordered_unique_range_t, InputIterator first, InputIterator last
253
264
  , const Compare& comp = Compare(), const allocator_type& a = allocator_type())
254
- : m_flat_tree(ordered_range, first, last, comp, a)
265
+ : m_flat_tree(ordered_unique_range, first, last, comp, a)
255
266
  {
256
- //A type must be std::pair<Key, T>
267
+ //value_type must be std::pair<Key, T>
257
268
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
258
269
  }
259
270
 
@@ -267,7 +278,7 @@ class flat_map
267
278
  const allocator_type& a = allocator_type())
268
279
  : m_flat_tree(true, il.begin(), il.end(), comp, container_detail::force<impl_allocator_type>(a))
269
280
  {
270
- //A type must be std::pair<Key, T>
281
+ //value_type must be std::pair<Key, T>
271
282
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
272
283
  }
273
284
 
@@ -279,7 +290,7 @@ class flat_map
279
290
  flat_map(std::initializer_list<value_type> il, const allocator_type& a)
280
291
  : m_flat_tree(true, il.begin(), il.end(), Compare(), container_detail::force<impl_allocator_type>(a))
281
292
  {
282
- //A type must be std::pair<Key, T>
293
+ //value_type must be std::pair<Key, T>
283
294
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
284
295
  }
285
296
 
@@ -295,9 +306,9 @@ class flat_map
295
306
  //! <b>Note</b>: Non-standard extension.
296
307
  flat_map(ordered_unique_range_t, std::initializer_list<value_type> il, const Compare& comp = Compare(),
297
308
  const allocator_type& a = allocator_type())
298
- : m_flat_tree(ordered_range, il.begin(), il.end(), comp, a)
309
+ : m_flat_tree(ordered_unique_range, il.begin(), il.end(), comp, a)
299
310
  {
300
- //A type must be std::pair<Key, T>
311
+ //value_type must be std::pair<Key, T>
301
312
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
302
313
  }
303
314
  #endif
@@ -308,7 +319,7 @@ class flat_map
308
319
  flat_map(const flat_map& x)
309
320
  : m_flat_tree(x.m_flat_tree)
310
321
  {
311
- //A type must be std::pair<Key, T>
322
+ //value_type must be std::pair<Key, T>
312
323
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
313
324
  }
314
325
 
@@ -319,9 +330,10 @@ class flat_map
319
330
  //!
320
331
  //! <b>Postcondition</b>: x is emptied.
321
332
  flat_map(BOOST_RV_REF(flat_map) x)
333
+ BOOST_NOEXCEPT_IF(boost::container::container_detail::is_nothrow_move_constructible<Compare>::value)
322
334
  : m_flat_tree(boost::move(x.m_flat_tree))
323
335
  {
324
- //A type must be std::pair<Key, T>
336
+ //value_type must be std::pair<Key, T>
325
337
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
326
338
  }
327
339
 
@@ -331,7 +343,7 @@ class flat_map
331
343
  flat_map(const flat_map& x, const allocator_type &a)
332
344
  : m_flat_tree(x.m_flat_tree, a)
333
345
  {
334
- //A type must be std::pair<Key, T>
346
+ //value_type must be std::pair<Key, T>
335
347
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
336
348
  }
337
349
 
@@ -342,7 +354,7 @@ class flat_map
342
354
  flat_map(BOOST_RV_REF(flat_map) x, const allocator_type &a)
343
355
  : m_flat_tree(boost::move(x.m_flat_tree), a)
344
356
  {
345
- //A type must be std::pair<Key, T>
357
+ //value_type must be std::pair<Key, T>
346
358
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
347
359
  }
348
360
 
@@ -362,8 +374,9 @@ class flat_map
362
374
  //! propagate_on_container_move_assignment is true or
363
375
  //! this->get>allocator() == x.get_allocator(). Linear otherwise.
364
376
  flat_map& operator=(BOOST_RV_REF(flat_map) x)
365
- BOOST_NOEXCEPT_IF( allocator_traits_type::is_always_equal::value
366
- && boost::container::container_detail::is_nothrow_move_assignable<Compare>::value )
377
+ BOOST_NOEXCEPT_IF( (allocator_traits_type::propagate_on_container_move_assignment::value ||
378
+ allocator_traits_type::is_always_equal::value) &&
379
+ boost::container::container_detail::is_nothrow_move_assignable<Compare>::value)
367
380
  { m_flat_tree = boost::move(x.m_flat_tree); return *this; }
368
381
 
369
382
  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
@@ -601,6 +614,96 @@ class flat_map
601
614
  BOOST_MOVE_CONVERSION_AWARE_CATCH( operator[] , key_type, mapped_type&, this->priv_subscript)
602
615
  #endif
603
616
 
617
+ //! Effects: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
618
+ //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
619
+ //! as if by insert, constructing it from value_type(k, forward<M>(obj)).
620
+ //!
621
+ //! No iterators or references are invalidated. If the insertion is successful, pointers and references
622
+ //! to the element obtained while it is held in the node handle are invalidated, and pointers and
623
+ //! references obtained to that element before it was extracted become valid.
624
+ //!
625
+ //! Returns: The bool component is true if the insertion took place and false if the assignment
626
+ //! took place. The iterator component is pointing at the element that was inserted or updated.
627
+ //!
628
+ //! Complexity: Logarithmic in the size of the container.
629
+ template <class M>
630
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> insert_or_assign(const key_type& k, BOOST_FWD_REF(M) obj)
631
+ {
632
+ return container_detail::force_copy< std::pair<iterator, bool> >
633
+ (this->m_flat_tree.insert_or_assign
634
+ ( impl_const_iterator(), k, ::boost::forward<M>(obj))
635
+ );
636
+ }
637
+
638
+ //! Effects: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
639
+ //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
640
+ //! as if by insert, constructing it from value_type(k, move(obj)).
641
+ //!
642
+ //! No iterators or references are invalidated. If the insertion is successful, pointers and references
643
+ //! to the element obtained while it is held in the node handle are invalidated, and pointers and
644
+ //! references obtained to that element before it was extracted become valid.
645
+ //!
646
+ //! Returns: The bool component is true if the insertion took place and false if the assignment
647
+ //! took place. The iterator component is pointing at the element that was inserted or updated.
648
+ //!
649
+ //! Complexity: Logarithmic in the size of the container.
650
+ template <class M>
651
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> insert_or_assign(BOOST_RV_REF(key_type) k, BOOST_FWD_REF(M) obj)
652
+ {
653
+ return container_detail::force_copy< std::pair<iterator, bool> >
654
+ (this->m_flat_tree.insert_or_assign
655
+ ( impl_const_iterator(), ::boost::move(k), ::boost::forward<M>(obj))
656
+ );
657
+ }
658
+
659
+ //! Effects: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
660
+ //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
661
+ //! as if by insert, constructing it from value_type(k, forward<M>(obj)) and the new element
662
+ //! to the container as close as possible to the position just before hint.
663
+ //!
664
+ //! No iterators or references are invalidated. If the insertion is successful, pointers and references
665
+ //! to the element obtained while it is held in the node handle are invalidated, and pointers and
666
+ //! references obtained to that element before it was extracted become valid.
667
+ //!
668
+ //! Returns: The bool component is true if the insertion took place and false if the assignment
669
+ //! took place. The iterator component is pointing at the element that was inserted or updated.
670
+ //!
671
+ //! Complexity: Logarithmic in the size of the container in general, but amortized constant if
672
+ //! the new element is inserted just before hint.
673
+ template <class M>
674
+ BOOST_CONTAINER_FORCEINLINE iterator insert_or_assign(const_iterator hint, const key_type& k, BOOST_FWD_REF(M) obj)
675
+ {
676
+ return container_detail::force_copy< std::pair<iterator, bool> >
677
+ (this->m_flat_tree.insert_or_assign
678
+ ( container_detail::force_copy<impl_const_iterator>(hint)
679
+ , k, ::boost::forward<M>(obj))
680
+ );
681
+ }
682
+
683
+ //! Effects: If a key equivalent to k already exists in the container, assigns forward<M>(obj)
684
+ //! to the mapped_type corresponding to the key k. If the key does not exist, inserts the new value
685
+ //! as if by insert, constructing it from value_type(k, move(obj)) and the new element
686
+ //! to the container as close as possible to the position just before hint.
687
+ //!
688
+ //! No iterators or references are invalidated. If the insertion is successful, pointers and references
689
+ //! to the element obtained while it is held in the node handle are invalidated, and pointers and
690
+ //! references obtained to that element before it was extracted become valid.
691
+ //!
692
+ //! Returns: The bool component is true if the insertion took place and false if the assignment
693
+ //! took place. The iterator component is pointing at the element that was inserted or updated.
694
+ //!
695
+ //! Complexity: Logarithmic in the size of the container in general, but amortized constant if
696
+ //! the new element is inserted just before hint.
697
+ template <class M>
698
+ BOOST_CONTAINER_FORCEINLINE iterator insert_or_assign(const_iterator hint, BOOST_RV_REF(key_type) k, BOOST_FWD_REF(M) obj)
699
+ {
700
+ return container_detail::force_copy< std::pair<iterator, bool> >
701
+ (this->m_flat_tree.insert_or_assign
702
+ ( container_detail::force_copy<impl_const_iterator>(hint)
703
+ , ::boost::move(k), ::boost::forward<M>(obj))
704
+ );
705
+ }
706
+
604
707
  //! @copydoc ::boost::container::flat_set::nth(size_type)
605
708
  iterator nth(size_type n) BOOST_NOEXCEPT_OR_NOTHROW
606
709
  { return container_detail::force_copy<iterator>(m_flat_tree.nth(n)); }
@@ -689,6 +792,79 @@ class flat_map
689
792
  , boost::forward<Args>(args)...));
690
793
  }
691
794
 
795
+ //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
796
+ //! forward_as_tuple(k), forward_as_tuple(forward<Args>(args)...).
797
+ //!
798
+ //! <b>Effects</b>: If the map already contains an element whose key is equivalent to k, there is no effect. Otherwise
799
+ //! inserts an object of type value_type constructed with piecewise_construct, forward_as_tuple(k),
800
+ //! forward_as_tuple(forward<Args>(args)...).
801
+ //!
802
+ //! <b>Returns</b>: The bool component of the returned pair is true if and only if the
803
+ //! insertion took place. The returned iterator points to the map element whose key is equivalent to k.
804
+ //!
805
+ //! <b>Complexity</b>: Logarithmic.
806
+ template <class... Args>
807
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> try_emplace(const key_type& k, BOOST_FWD_REF(Args)... args)
808
+ {
809
+ return container_detail::force_copy< std::pair<iterator, bool> >(
810
+ m_flat_tree.try_emplace(impl_const_iterator(), k, boost::forward<Args>(args)...));
811
+ }
812
+
813
+ //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
814
+ //! forward_as_tuple(k), forward_as_tuple(forward<Args>(args)...).
815
+ //!
816
+ //! <b>Effects</b>: If the map already contains an element whose key is equivalent to k, there is no effect. Otherwise
817
+ //! inserts an object of type value_type constructed with piecewise_construct, forward_as_tuple(k),
818
+ //! forward_as_tuple(forward<Args>(args)...).
819
+ //!
820
+ //! <b>Returns</b>: The returned iterator points to the map element whose key is equivalent to k.
821
+ //!
822
+ //! <b>Complexity</b>: Logarithmic in general, but amortized constant if value
823
+ //! is inserted right before p.
824
+ template <class... Args>
825
+ BOOST_CONTAINER_FORCEINLINE iterator try_emplace(const_iterator hint, const key_type &k, BOOST_FWD_REF(Args)... args)
826
+ {
827
+ return container_detail::force_copy<iterator>(m_flat_tree.try_emplace
828
+ (container_detail::force_copy<impl_const_iterator>(hint), k, boost::forward<Args>(args)...).first);
829
+ }
830
+
831
+ //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
832
+ //! forward_as_tuple(move(k)), forward_as_tuple(forward<Args>(args)...).
833
+ //!
834
+ //! <b>Effects</b>: If the map already contains an element whose key is equivalent to k, there is no effect. Otherwise
835
+ //! inserts an object of type value_type constructed with piecewise_construct, forward_as_tuple(move(k)),
836
+ //! forward_as_tuple(forward<Args>(args)...).
837
+ //!
838
+ //! <b>Returns</b>: The bool component of the returned pair is true if and only if the
839
+ //! insertion took place. The returned iterator points to the map element whose key is equivalent to k.
840
+ //!
841
+ //! <b>Complexity</b>: Logarithmic.
842
+ template <class... Args>
843
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> try_emplace(BOOST_RV_REF(key_type) k, BOOST_FWD_REF(Args)... args)
844
+ {
845
+ return container_detail::force_copy< std::pair<iterator, bool> >
846
+ (m_flat_tree.try_emplace(impl_const_iterator(), boost::move(k), boost::forward<Args>(args)...));
847
+ }
848
+
849
+ //! <b>Requires</b>: value_type shall be EmplaceConstructible into map from piecewise_construct,
850
+ //! forward_as_tuple(move(k)), forward_as_tuple(forward<Args>(args)...).
851
+ //!
852
+ //! <b>Effects</b>: If the map already contains an element whose key is equivalent to k, there is no effect. Otherwise
853
+ //! inserts an object of type value_type constructed with piecewise_construct, forward_as_tuple(move(k)),
854
+ //! forward_as_tuple(forward<Args>(args)...).
855
+ //!
856
+ //! <b>Returns</b>: The returned iterator points to the map element whose key is equivalent to k.
857
+ //!
858
+ //! <b>Complexity</b>: Logarithmic in general, but amortized constant if value
859
+ //! is inserted right before p.
860
+ template <class... Args>
861
+ BOOST_CONTAINER_FORCEINLINE iterator try_emplace(const_iterator hint, BOOST_RV_REF(key_type) k, BOOST_FWD_REF(Args)... args)
862
+ {
863
+ return container_detail::force_copy<iterator>
864
+ (m_flat_tree.try_emplace(container_detail::force_copy
865
+ <impl_const_iterator>(hint), boost::move(k), boost::forward<Args>(args)...).first);
866
+ }
867
+
692
868
  #else // !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
693
869
 
694
870
  #define BOOST_CONTAINER_FLAT_MAP_EMPLACE_CODE(N) \
@@ -705,6 +881,29 @@ class flat_map
705
881
  return container_detail::force_copy<iterator>(m_flat_tree.emplace_hint_unique\
706
882
  (container_detail::force_copy<impl_const_iterator>(hint) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
707
883
  }\
884
+ BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
885
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> try_emplace(const key_type& k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
886
+ {\
887
+ return container_detail::force_copy< std::pair<iterator, bool> >\
888
+ (m_flat_tree.try_emplace(impl_const_iterator(), k BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
889
+ }\
890
+ \
891
+ BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
892
+ BOOST_CONTAINER_FORCEINLINE iterator try_emplace(const_iterator hint, const key_type &k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
893
+ { return container_detail::force_copy<iterator>(m_flat_tree.try_emplace\
894
+ (container_detail::force_copy<impl_const_iterator>(hint), k BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); }\
895
+ \
896
+ BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
897
+ BOOST_CONTAINER_FORCEINLINE std::pair<iterator, bool> try_emplace(BOOST_RV_REF(key_type) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
898
+ {\
899
+ return container_detail::force_copy< std::pair<iterator, bool> >\
900
+ (m_flat_tree.try_emplace(impl_const_iterator(), boost::move(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N));\
901
+ }\
902
+ \
903
+ BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \
904
+ BOOST_CONTAINER_FORCEINLINE iterator try_emplace(const_iterator hint, BOOST_RV_REF(key_type) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
905
+ { return container_detail::force_copy<iterator>(m_flat_tree.try_emplace\
906
+ (container_detail::force_copy<impl_const_iterator>(hint), boost::move(k) BOOST_MOVE_I##N BOOST_MOVE_FWD##N).first); }\
708
907
  //
709
908
  BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_FLAT_MAP_EMPLACE_CODE)
710
909
  #undef BOOST_CONTAINER_FLAT_MAP_EMPLACE_CODE
@@ -867,6 +1066,39 @@ class flat_map
867
1066
  { m_flat_tree.insert_unique(ordered_unique_range, il.begin(), il.end()); }
868
1067
  #endif
869
1068
 
1069
+ //! <b>Requires</b>: this->get_allocator() == source.get_allocator().
1070
+ //!
1071
+ //! <b>Effects</b>: Attempts to extract each element in source and insert it into a using
1072
+ //! the comparison object of *this. If there is an element in a with key equivalent to the
1073
+ //! key of an element from source, then that element is not extracted from source.
1074
+ //!
1075
+ //! <b>Postcondition</b>: Pointers and references to the transferred elements of source refer
1076
+ //! to those same elements but as members of *this. Iterators referring to the transferred
1077
+ //! elements will continue to refer to their elements, but they now behave as iterators into *this,
1078
+ //! not into source.
1079
+ //!
1080
+ //! <b>Throws</b>: Nothing unless the comparison object throws.
1081
+ //!
1082
+ //! <b>Complexity</b>: N log(a.size() + N) (N has the value source.size())
1083
+ template<class C2>
1084
+ BOOST_CONTAINER_FORCEINLINE void merge(flat_map<Key, T, C2, Allocator>& source)
1085
+ { m_flat_tree.merge_unique(source.tree()); }
1086
+
1087
+ //! @copydoc ::boost::container::flat_map::merge(flat_map<Key, T, C2, Allocator>&)
1088
+ template<class C2>
1089
+ BOOST_CONTAINER_FORCEINLINE void merge(BOOST_RV_REF_BEG flat_map<Key, T, C2, Allocator> BOOST_RV_REF_END source)
1090
+ { return this->merge(static_cast<flat_map<Key, T, C2, Allocator>&>(source)); }
1091
+
1092
+ //! @copydoc ::boost::container::flat_map::merge(flat_map<Key, T, C2, Allocator>&)
1093
+ template<class C2>
1094
+ BOOST_CONTAINER_FORCEINLINE void merge(flat_multimap<Key, T, C2, Allocator>& source)
1095
+ { m_flat_tree.merge_unique(source.tree()); }
1096
+
1097
+ //! @copydoc ::boost::container::flat_map::merge(flat_map<Key, T, C2, Allocator>&)
1098
+ template<class C2>
1099
+ BOOST_CONTAINER_FORCEINLINE void merge(BOOST_RV_REF_BEG flat_multimap<Key, T, C2, Allocator> BOOST_RV_REF_END source)
1100
+ { return this->merge(static_cast<flat_multimap<Key, T, C2, Allocator>&>(source)); }
1101
+
870
1102
  //! <b>Effects</b>: Erases the element pointed to by p.
871
1103
  //!
872
1104
  //! <b>Returns</b>: Returns an iterator pointing to the element immediately
@@ -1137,15 +1369,15 @@ class flat_multimap
1137
1369
  #ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1138
1370
  private:
1139
1371
  BOOST_COPYABLE_AND_MOVABLE(flat_multimap)
1140
- typedef container_detail::flat_tree<Key,
1372
+ typedef container_detail::flat_tree<
1141
1373
  std::pair<Key, T>,
1142
- container_detail::select1st< std::pair<Key, T> >,
1374
+ container_detail::select1st<Key>,
1143
1375
  Compare,
1144
1376
  Allocator> tree_t;
1145
1377
  //This is the real tree stored here. It's based on a movable pair
1146
- typedef container_detail::flat_tree<Key,
1378
+ typedef container_detail::flat_tree<
1147
1379
  container_detail::pair<Key, T>,
1148
- container_detail::select1st<container_detail::pair<Key, T> >,
1380
+ container_detail::select1st<Key>,
1149
1381
  Compare,
1150
1382
  typename allocator_traits<Allocator>::template portable_rebind_alloc
1151
1383
  <container_detail::pair<Key, T> >::type> impl_tree_t;
@@ -1157,7 +1389,7 @@ class flat_multimap
1157
1389
  typedef typename impl_tree_t::allocator_type impl_allocator_type;
1158
1390
  typedef container_detail::flat_tree_value_compare
1159
1391
  < Compare
1160
- , container_detail::select1st< std::pair<Key, T> >
1392
+ , container_detail::select1st<Key>
1161
1393
  , std::pair<Key, T> > value_compare_impl;
1162
1394
  typedef typename container_detail::get_flat_tree_iterators
1163
1395
  <typename allocator_traits<Allocator>::pointer>::iterator iterator_impl;
@@ -1169,6 +1401,13 @@ class flat_multimap
1169
1401
  <typename allocator_traits<Allocator>::pointer>::const_reverse_iterator const_reverse_iterator_impl;
1170
1402
  public:
1171
1403
  typedef typename impl_tree_t::stored_allocator_type impl_stored_allocator_type;
1404
+
1405
+ impl_tree_t &tree()
1406
+ { return m_flat_tree; }
1407
+
1408
+ const impl_tree_t &tree() const
1409
+ { return m_flat_tree; }
1410
+
1172
1411
  private:
1173
1412
  #endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
1174
1413
 
@@ -1208,10 +1447,11 @@ class flat_multimap
1208
1447
  //! <b>Effects</b>: Default constructs an empty flat_map.
1209
1448
  //!
1210
1449
  //! <b>Complexity</b>: Constant.
1211
- flat_multimap()
1450
+ flat_multimap() BOOST_NOEXCEPT_IF(container_detail::is_nothrow_default_constructible<Allocator>::value &&
1451
+ container_detail::is_nothrow_default_constructible<Compare>::value)
1212
1452
  : m_flat_tree()
1213
1453
  {
1214
- //A type must be std::pair<Key, T>
1454
+ //value_type must be std::pair<Key, T>
1215
1455
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1216
1456
  }
1217
1457
 
@@ -1223,7 +1463,7 @@ class flat_multimap
1223
1463
  const allocator_type& a = allocator_type())
1224
1464
  : m_flat_tree(comp, container_detail::force<impl_allocator_type>(a))
1225
1465
  {
1226
- //A type must be std::pair<Key, T>
1466
+ //value_type must be std::pair<Key, T>
1227
1467
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1228
1468
  }
1229
1469
 
@@ -1233,7 +1473,7 @@ class flat_multimap
1233
1473
  explicit flat_multimap(const allocator_type& a)
1234
1474
  : m_flat_tree(container_detail::force<impl_allocator_type>(a))
1235
1475
  {
1236
- //A type must be std::pair<Key, T>
1476
+ //value_type must be std::pair<Key, T>
1237
1477
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1238
1478
  }
1239
1479
 
@@ -1248,7 +1488,7 @@ class flat_multimap
1248
1488
  const allocator_type& a = allocator_type())
1249
1489
  : m_flat_tree(false, first, last, comp, container_detail::force<impl_allocator_type>(a))
1250
1490
  {
1251
- //A type must be std::pair<Key, T>
1491
+ //value_type must be std::pair<Key, T>
1252
1492
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1253
1493
  }
1254
1494
 
@@ -1261,7 +1501,7 @@ class flat_multimap
1261
1501
  flat_multimap(InputIterator first, InputIterator last, const allocator_type& a)
1262
1502
  : m_flat_tree(false, first, last, Compare(), container_detail::force<impl_allocator_type>(a))
1263
1503
  {
1264
- //A type must be std::pair<Key, T>
1504
+ //value_type must be std::pair<Key, T>
1265
1505
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1266
1506
  }
1267
1507
 
@@ -1280,7 +1520,7 @@ class flat_multimap
1280
1520
  const allocator_type& a = allocator_type())
1281
1521
  : m_flat_tree(ordered_range, first, last, comp, a)
1282
1522
  {
1283
- //A type must be std::pair<Key, T>
1523
+ //value_type must be std::pair<Key, T>
1284
1524
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1285
1525
  }
1286
1526
 
@@ -1293,7 +1533,7 @@ class flat_multimap
1293
1533
  flat_multimap(std::initializer_list<value_type> il, const Compare& comp = Compare(), const allocator_type& a = allocator_type())
1294
1534
  : m_flat_tree(false, il.begin(), il.end(), comp, container_detail::force<impl_allocator_type>(a))
1295
1535
  {
1296
- //A type must be std::pair<Key, T>
1536
+ //value_type must be std::pair<Key, T>
1297
1537
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1298
1538
  }
1299
1539
 
@@ -1305,7 +1545,7 @@ class flat_multimap
1305
1545
  flat_multimap(std::initializer_list<value_type> il, const allocator_type& a)
1306
1546
  : m_flat_tree(false, il.begin(), il.end(), Compare(), container_detail::force<impl_allocator_type>(a))
1307
1547
  {
1308
- //A type must be std::pair<Key, T>
1548
+ //value_type must be std::pair<Key, T>
1309
1549
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1310
1550
  }
1311
1551
 
@@ -1322,7 +1562,7 @@ class flat_multimap
1322
1562
  const allocator_type& a = allocator_type())
1323
1563
  : m_flat_tree(ordered_range, il.begin(), il.end(), comp, a)
1324
1564
  {
1325
- //A type must be std::pair<Key, T>
1565
+ //value_type must be std::pair<Key, T>
1326
1566
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1327
1567
  }
1328
1568
  #endif
@@ -1333,7 +1573,7 @@ class flat_multimap
1333
1573
  flat_multimap(const flat_multimap& x)
1334
1574
  : m_flat_tree(x.m_flat_tree)
1335
1575
  {
1336
- //A type must be std::pair<Key, T>
1576
+ //value_type must be std::pair<Key, T>
1337
1577
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1338
1578
  }
1339
1579
 
@@ -1343,9 +1583,10 @@ class flat_multimap
1343
1583
  //!
1344
1584
  //! <b>Postcondition</b>: x is emptied.
1345
1585
  flat_multimap(BOOST_RV_REF(flat_multimap) x)
1586
+ BOOST_NOEXCEPT_IF(boost::container::container_detail::is_nothrow_move_constructible<Compare>::value)
1346
1587
  : m_flat_tree(boost::move(x.m_flat_tree))
1347
1588
  {
1348
- //A type must be std::pair<Key, T>
1589
+ //value_type must be std::pair<Key, T>
1349
1590
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1350
1591
  }
1351
1592
 
@@ -1355,7 +1596,7 @@ class flat_multimap
1355
1596
  flat_multimap(const flat_multimap& x, const allocator_type &a)
1356
1597
  : m_flat_tree(x.m_flat_tree, a)
1357
1598
  {
1358
- //A type must be std::pair<Key, T>
1599
+ //value_type must be std::pair<Key, T>
1359
1600
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1360
1601
  }
1361
1602
 
@@ -1366,7 +1607,7 @@ class flat_multimap
1366
1607
  flat_multimap(BOOST_RV_REF(flat_multimap) x, const allocator_type &a)
1367
1608
  : m_flat_tree(boost::move(x.m_flat_tree), a)
1368
1609
  {
1369
- //A type must be std::pair<Key, T>
1610
+ //value_type must be std::pair<Key, T>
1370
1611
  BOOST_STATIC_ASSERT((container_detail::is_same<std::pair<Key, T>, typename Allocator::value_type>::value));
1371
1612
  }
1372
1613
 
@@ -1380,8 +1621,9 @@ class flat_multimap
1380
1621
  //!
1381
1622
  //! <b>Complexity</b>: Constant.
1382
1623
  flat_multimap& operator=(BOOST_RV_REF(flat_multimap) x)
1383
- BOOST_NOEXCEPT_IF( allocator_traits_type::is_always_equal::value
1384
- && boost::container::container_detail::is_nothrow_move_assignable<Compare>::value )
1624
+ BOOST_NOEXCEPT_IF( (allocator_traits_type::propagate_on_container_move_assignment::value ||
1625
+ allocator_traits_type::is_always_equal::value) &&
1626
+ boost::container::container_detail::is_nothrow_move_assignable<Compare>::value)
1385
1627
  { m_flat_tree = boost::move(x.m_flat_tree); return *this; }
1386
1628
 
1387
1629
  #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
@@ -1801,6 +2043,38 @@ class flat_multimap
1801
2043
  { m_flat_tree.insert_equal(ordered_range, il.begin(), il.end()); }
1802
2044
  #endif
1803
2045
 
2046
+ //! <b>Requires</b>: this->get_allocator() == source.get_allocator().
2047
+ //!
2048
+ //! <b>Effects</b>: Extracts each element in source and insert it into a using
2049
+ //! the comparison object of *this.
2050
+ //!
2051
+ //! <b>Postcondition</b>: Pointers and references to the transferred elements of source refer
2052
+ //! to those same elements but as members of *this. Iterators referring to the transferred
2053
+ //! elements will continue to refer to their elements, but they now behave as iterators into *this,
2054
+ //! not into source.
2055
+ //!
2056
+ //! <b>Throws</b>: Nothing unless the comparison object throws.
2057
+ //!
2058
+ //! <b>Complexity</b>: N log(a.size() + N) (N has the value source.size())
2059
+ template<class C2>
2060
+ void merge(flat_multimap<Key, T, C2, Allocator>& source)
2061
+ { m_flat_tree.merge_equal(source.tree()); }
2062
+
2063
+ //! @copydoc ::boost::container::flat_multimap::merge(flat_multimap<Key, T, C2, Allocator>&)
2064
+ template<class C2>
2065
+ void merge(BOOST_RV_REF_BEG flat_multimap<Key, T, C2, Allocator> BOOST_RV_REF_END source)
2066
+ { return this->merge(static_cast<flat_multimap<Key, T, C2, Allocator>&>(source)); }
2067
+
2068
+ //! @copydoc ::boost::container::flat_multimap::merge(flat_multimap<Key, T, C2, Allocator>&)
2069
+ template<class C2>
2070
+ void merge(flat_map<Key, T, C2, Allocator>& source)
2071
+ { m_flat_tree.merge_equal(source.tree()); }
2072
+
2073
+ //! @copydoc ::boost::container::flat_multimap::merge(flat_multimap<Key, T, C2, Allocator>&)
2074
+ template<class C2>
2075
+ void merge(BOOST_RV_REF_BEG flat_map<Key, T, C2, Allocator> BOOST_RV_REF_END source)
2076
+ { return this->merge(static_cast<flat_map<Key, T, C2, Allocator>&>(source)); }
2077
+
1804
2078
  //! <b>Effects</b>: Erases the element pointed to by p.
1805
2079
  //!
1806
2080
  //! <b>Returns</b>: Returns an iterator pointing to the element immediately