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
@@ -289,11 +289,13 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
289
289
  BidiIterator oldposition(position);
290
290
  const re_syntax_base* old_pstate = jmp->alt.p;
291
291
  pstate = pstate->next.p;
292
+ bool oldcase = icase;
292
293
  m_have_then = false;
293
294
  if(!match_all_states())
294
295
  {
295
296
  pstate = old_pstate;
296
297
  position = oldposition;
298
+ icase = oldcase;
297
299
  if(m_have_then)
298
300
  {
299
301
  m_can_backtrack = true;
@@ -898,10 +900,27 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_recursion()
898
900
  {
899
901
  recursion_stack.reserve(50);
900
902
  }
903
+ //
904
+ // See if we've seen this recursion before at this location, if we have then
905
+ // we need to prevent infinite recursion:
906
+ //
907
+ for(typename std::vector<recursion_info<results_type> >::reverse_iterator i = recursion_stack.rbegin(); i != recursion_stack.rend(); ++i)
908
+ {
909
+ if(i->idx == static_cast<const re_brace*>(static_cast<const re_jump*>(pstate)->alt.p)->index)
910
+ {
911
+ if(i->location_of_start == position)
912
+ return false;
913
+ break;
914
+ }
915
+ }
916
+ //
917
+ // Now get on with it:
918
+ //
901
919
  recursion_stack.push_back(recursion_info<results_type>());
902
920
  recursion_stack.back().preturn_address = pstate->next.p;
903
921
  recursion_stack.back().results = *m_presult;
904
922
  recursion_stack.back().repeater_stack = next_count;
923
+ recursion_stack.back().location_of_start = position;
905
924
  pstate = static_cast<const re_jump*>(pstate)->alt.p;
906
925
  recursion_stack.back().idx = static_cast<const re_brace*>(pstate)->index;
907
926
 
@@ -977,6 +996,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
977
996
  recursion_stack.push_back(recursion_info<results_type>());
978
997
  recursion_stack.back().preturn_address = saved_state;
979
998
  recursion_stack.back().results = *m_presult;
999
+ recursion_stack.back().location_of_start = position;
980
1000
  return false;
981
1001
  }
982
1002
  return true;
@@ -1036,6 +1056,20 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_then()
1036
1056
  return false;
1037
1057
  }
1038
1058
 
1059
+ template <class BidiIterator, class Allocator, class traits>
1060
+ bool perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case()
1061
+ {
1062
+ // change our case sensitivity:
1063
+ bool oldcase = this->icase;
1064
+ this->icase = static_cast<const re_case*>(pstate)->icase;
1065
+ pstate = pstate->next.p;
1066
+ bool result = match_all_states();
1067
+ this->icase = oldcase;
1068
+ return result;
1069
+ }
1070
+
1071
+
1072
+
1039
1073
  template <class BidiIterator, class Allocator, class traits>
1040
1074
  bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index, bool have_match)
1041
1075
  {
@@ -86,7 +86,7 @@ struct trivial_format_traits
86
86
  }
87
87
  int toi(const charT*& p1, const charT* p2, int radix)const
88
88
  {
89
- return global_toi(p1, p2, radix, *this);
89
+ return (int)global_toi(p1, p2, radix, *this);
90
90
  }
91
91
  };
92
92
 
@@ -165,7 +165,7 @@ private:
165
165
  std::vector<char_type> v(i, j);
166
166
  const char_type* start = &v[0];
167
167
  const char_type* pos = start;
168
- int r = m_traits.toi(pos, &v[0] + v.size(), base);
168
+ int r = (int)m_traits.toi(pos, &v[0] + v.size(), base);
169
169
  std::advance(i, pos - start);
170
170
  return r;
171
171
  }
@@ -109,7 +109,7 @@ struct default_wrapper : public BaseT
109
109
  {
110
110
  return ((c & 0x7f) == c) ? get_default_escape_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::escape_type_identity;
111
111
  }
112
- int toi(const char_type*& p1, const char_type* p2, int radix)const
112
+ boost::intmax_t toi(const char_type*& p1, const char_type* p2, int radix)const
113
113
  {
114
114
  return ::boost::BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
115
115
  }
@@ -304,13 +304,13 @@ int global_value(charT c)
304
304
  return -1;
305
305
  }
306
306
  template <class charT, class traits>
307
- int global_toi(const charT*& p1, const charT* p2, int radix, const traits& t)
307
+ boost::intmax_t global_toi(const charT*& p1, const charT* p2, int radix, const traits& t)
308
308
  {
309
309
  (void)t; // warning suppression
310
- int next_value = t.value(*p1, radix);
310
+ boost::intmax_t next_value = t.value(*p1, radix);
311
311
  if((p1 == p2) || (next_value < 0) || (next_value >= radix))
312
312
  return -1;
313
- int result = 0;
313
+ boost::intmax_t result = 0;
314
314
  while(p1 != p2)
315
315
  {
316
316
  next_value = t.value(*p1, radix);
@@ -33,6 +33,7 @@
33
33
  #include <algorithm>
34
34
  #include <iosfwd>
35
35
  #include <vector>
36
+ #include <set>
36
37
  #include <map>
37
38
  #include <boost/limits.hpp>
38
39
  #include <boost/assert.hpp>
@@ -640,13 +640,13 @@ public:
640
640
  return true;
641
641
  return false;
642
642
  }
643
- int toi(const charT*& p1, const charT* p2, int radix)const
643
+ boost::intmax_t toi(const charT*& p1, const charT* p2, int radix)const
644
644
  {
645
645
  return ::boost::BOOST_REGEX_DETAIL_NS::global_toi(p1, p2, radix, *this);
646
646
  }
647
647
  int value(charT c, int radix)const
648
648
  {
649
- int result = ::boost::BOOST_REGEX_DETAIL_NS::global_value(c);
649
+ int result = (int)::boost::BOOST_REGEX_DETAIL_NS::global_value(c);
650
650
  return result < radix ? result : -1;
651
651
  }
652
652
  locale_type imbue(locale_type l)
@@ -1,181 +1,1026 @@
1
1
  /*
2
- * Copyright (c) 2012-2014 Glen Joseph Fernandes
3
- * glenfe at live dot com
4
- *
5
- * Distributed under the Boost Software License,
6
- * Version 1.0. (See accompanying file LICENSE_1_0.txt
7
- * or copy at http://boost.org/LICENSE_1_0.txt)
8
- */
2
+ Copyright 2012-2017 Glen Joseph Fernandes
3
+ (glenjofe@gmail.com)
4
+
5
+ Distributed under the Boost Software License, Version 1.0.
6
+ (http://www.boost.org/LICENSE_1_0.txt)
7
+ */
9
8
  #ifndef BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
10
9
  #define BOOST_SMART_PTR_ALLOCATE_SHARED_ARRAY_HPP
11
10
 
12
- #include <boost/smart_ptr/detail/array_count_impl.hpp>
13
- #include <boost/smart_ptr/detail/sp_if_array.hpp>
11
+ #include <boost/smart_ptr/shared_ptr.hpp>
12
+ #include <boost/type_traits/has_trivial_constructor.hpp>
13
+ #include <boost/type_traits/has_trivial_destructor.hpp>
14
+ #include <boost/type_traits/alignment_of.hpp>
15
+ #include <boost/type_traits/type_with_alignment.hpp>
14
16
 
15
17
  namespace boost {
16
- template<class T, class A>
17
- inline typename boost::detail::sp_if_array<T>::type
18
- allocate_shared(const A& allocator, std::size_t size) {
19
- typedef typename boost::detail::array_inner<T>::type T1;
20
- typedef typename boost::detail::array_base<T1>::type T2;
21
- typedef boost::detail::ms_init_tag R1;
22
- typedef boost::detail::as_allocator<A, T, R1> A1;
23
- typedef boost::detail::ms_in_allocator_tag D1;
24
- std::size_t n1 = size * boost::detail::array_total<T1>::size;
25
- T1* p1 = 0;
26
- T2* p2 = 0;
27
- D1 d1;
28
- A1 a1(allocator, size, &p2);
29
- shared_ptr<T> s1(p1, d1, a1);
30
- A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
31
- a2->set(0);
18
+ namespace detail {
19
+
20
+ template<class>
21
+ struct sp_if_array { };
22
+
23
+ template<class T>
24
+ struct sp_if_array<T[]> {
25
+ typedef boost::shared_ptr<T[]> type;
26
+ };
27
+
28
+ template<class>
29
+ struct sp_if_size_array { };
30
+
31
+ template<class T, std::size_t N>
32
+ struct sp_if_size_array<T[N]> {
33
+ typedef boost::shared_ptr<T[N]> type;
34
+ };
35
+
36
+ template<class>
37
+ struct sp_array_element { };
38
+
39
+ template<class T>
40
+ struct sp_array_element<T[]> {
41
+ typedef T type;
42
+ };
43
+
44
+ template<class T, std::size_t N>
45
+ struct sp_array_element<T[N]> {
46
+ typedef T type;
47
+ };
48
+
49
+ template<class T>
50
+ struct sp_array_scalar {
51
+ typedef T type;
52
+ };
53
+
54
+ template<class T, std::size_t N>
55
+ struct sp_array_scalar<T[N]> {
56
+ typedef typename sp_array_scalar<T>::type type;
57
+ };
58
+
59
+ template<class T, std::size_t N>
60
+ struct sp_array_scalar<const T[N]> {
61
+ typedef typename sp_array_scalar<T>::type type;
62
+ };
63
+
64
+ template<class T, std::size_t N>
65
+ struct sp_array_scalar<volatile T[N]> {
66
+ typedef typename sp_array_scalar<T>::type type;
67
+ };
68
+
69
+ template<class T, std::size_t N>
70
+ struct sp_array_scalar<const volatile T[N]> {
71
+ typedef typename sp_array_scalar<T>::type type;
72
+ };
73
+
74
+ template<class T>
75
+ struct sp_array_scalar<T[]> {
76
+ typedef typename sp_array_scalar<T>::type type;
77
+ };
78
+
79
+ template<class T>
80
+ struct sp_array_scalar<const T[]> {
81
+ typedef typename sp_array_scalar<T>::type type;
82
+ };
83
+
84
+ template<class T>
85
+ struct sp_array_scalar<volatile T[]> {
86
+ typedef typename sp_array_scalar<T>::type type;
87
+ };
88
+
89
+ template<class T>
90
+ struct sp_array_scalar<const volatile T[]> {
91
+ typedef typename sp_array_scalar<T>::type type;
92
+ };
93
+
94
+ template<class T>
95
+ struct sp_array_count {
96
+ enum {
97
+ value = 1
98
+ };
99
+ };
100
+
101
+ template<class T, std::size_t N>
102
+ struct sp_array_count<T[N]> {
103
+ enum {
104
+ value = N * sp_array_count<T>::value
105
+ };
106
+ };
107
+
108
+ template<class T>
109
+ struct sp_array_count<T[]> { };
110
+
111
+ template<class D, class T>
112
+ inline D*
113
+ sp_get_deleter(const
114
+ boost::shared_ptr<T>& value) BOOST_NOEXCEPT_OR_NOTHROW
115
+ {
116
+ return static_cast<D*>(value._internal_get_untyped_deleter());
117
+ }
118
+
119
+ template<std::size_t N, std::size_t A>
120
+ struct sp_array_storage {
121
+ union type {
122
+ char value[N];
123
+ typename boost::type_with_alignment<A>::type other;
124
+ };
125
+ };
126
+
127
+ template<std::size_t N, std::size_t M>
128
+ struct sp_max_size {
129
+ enum {
130
+ value = N < M ? M : N
131
+ };
132
+ };
133
+
32
134
  #if !defined(BOOST_NO_CXX11_ALLOCATOR)
33
- boost::detail::as_init(allocator, p2, n1);
135
+ template<class A, class T>
136
+ struct sp_bind_allocator {
137
+ typedef typename std::allocator_traits<A>::template
138
+ rebind_alloc<T> type;
139
+ };
34
140
  #else
35
- boost::detail::ms_init(p2, n1);
141
+ template<class A, class T>
142
+ struct sp_bind_allocator {
143
+ typedef typename A::template rebind<T>::other type;
144
+ };
36
145
  #endif
37
- a2->set(p2);
38
- p1 = reinterpret_cast<T1*>(p2);
39
- return shared_ptr<T>(s1, p1);
40
- }
41
-
42
- template<class T, class A>
43
- inline typename boost::detail::sp_if_size_array<T>::type
44
- allocate_shared(const A& allocator) {
45
- typedef typename boost::detail::array_inner<T>::type T1;
46
- typedef typename boost::detail::array_base<T1>::type T2;
47
- typedef boost::detail::ms_init_tag R1;
48
- typedef boost::detail::as_allocator<A, T, R1> A1;
49
- typedef boost::detail::ms_in_allocator_tag D1;
50
- enum {
51
- N = boost::detail::array_total<T>::size
52
- };
53
- T1* p1 = 0;
54
- T2* p2 = 0;
55
- D1 d1;
56
- A1 a1(allocator, &p2);
57
- shared_ptr<T> s1(p1, d1, a1);
58
- A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
59
- a2->set(0);
146
+
147
+ template<bool, class = void>
148
+ struct sp_enable { };
149
+
150
+ template<class T>
151
+ struct sp_enable<true, T> {
152
+ typedef T type;
153
+ };
154
+
155
+ template<class T>
156
+ inline
157
+ typename sp_enable<boost::has_trivial_destructor<T>::value>::type
158
+ sp_array_destroy(T*, std::size_t) BOOST_NOEXCEPT { }
159
+
160
+ template<class T>
161
+ inline
162
+ typename sp_enable<!boost::has_trivial_destructor<T>::value>::type
163
+ sp_array_destroy(T* storage, std::size_t size)
164
+ {
165
+ while (size > 0) {
166
+ storage[--size].~T();
167
+ }
168
+ }
169
+
60
170
  #if !defined(BOOST_NO_CXX11_ALLOCATOR)
61
- boost::detail::as_init(allocator, p2, N);
171
+ template<class A, class T>
172
+ inline void
173
+ sp_array_destroy(A& allocator, T* storage, std::size_t size)
174
+ {
175
+ while (size > 0) {
176
+ std::allocator_traits<A>::destroy(allocator, &storage[--size]);
177
+ }
178
+ }
179
+ #endif
180
+
181
+ #if !defined(BOOST_NO_EXCEPTIONS)
182
+ template<class T>
183
+ inline
184
+ typename sp_enable<boost::has_trivial_constructor<T>::value ||
185
+ boost::has_trivial_destructor<T>::value>::type
186
+ sp_array_construct(T* storage, std::size_t size)
187
+ {
188
+ for (std::size_t i = 0; i < size; ++i) {
189
+ ::new(static_cast<void*>(storage + i)) T();
190
+ }
191
+ }
192
+
193
+ template<class T>
194
+ inline
195
+ typename sp_enable<!boost::has_trivial_constructor<T>::value &&
196
+ !boost::has_trivial_destructor<T>::value>::type
197
+ sp_array_construct(T* storage, std::size_t size)
198
+ {
199
+ std::size_t i = 0;
200
+ try {
201
+ for (; i < size; ++i) {
202
+ ::new(static_cast<void*>(storage + i)) T();
203
+ }
204
+ } catch (...) {
205
+ while (i > 0) {
206
+ storage[--i].~T();
207
+ }
208
+ throw;
209
+ }
210
+ }
211
+
212
+ template<class T>
213
+ inline void
214
+ sp_array_construct(T* storage, std::size_t size, const T* list,
215
+ std::size_t count)
216
+ {
217
+ std::size_t i = 0;
218
+ try {
219
+ for (; i < size; ++i) {
220
+ ::new(static_cast<void*>(storage + i)) T(list[i % count]);
221
+ }
222
+ } catch (...) {
223
+ while (i > 0) {
224
+ storage[--i].~T();
225
+ }
226
+ throw;
227
+ }
228
+ }
62
229
  #else
63
- boost::detail::ms_init(p2, N);
230
+ template<class T>
231
+ inline void
232
+ sp_array_construct(T* storage, std::size_t size)
233
+ {
234
+ for (std::size_t i = 0; i < size; ++i) {
235
+ ::new(static_cast<void*>(storage + i)) T();
236
+ }
237
+ }
238
+
239
+ template<class T>
240
+ inline void
241
+ sp_array_construct(T* storage, std::size_t size, const T* list,
242
+ std::size_t count)
243
+ {
244
+ for (std::size_t i = 0; i < size; ++i) {
245
+ ::new(static_cast<void*>(storage + i)) T(list[i % count]);
246
+ }
247
+ }
64
248
  #endif
65
- a2->set(p2);
66
- p1 = reinterpret_cast<T1*>(p2);
67
- return shared_ptr<T>(s1, p1);
68
- }
69
-
70
- template<class T, class A>
71
- inline typename boost::detail::sp_if_array<T>::type
72
- allocate_shared(const A& allocator, std::size_t size,
73
- const typename boost::detail::array_inner<T>::type& value) {
74
- typedef typename boost::detail::array_inner<T>::type T1;
75
- typedef typename boost::detail::array_base<T1>::type T2;
76
- typedef const T2 T3;
77
- typedef boost::detail::ms_init_tag R1;
78
- typedef boost::detail::as_allocator<A, T, R1> A1;
79
- typedef boost::detail::ms_in_allocator_tag D1;
80
- enum {
81
- M = boost::detail::array_total<T1>::size
82
- };
83
- std::size_t n1 = M * size;
84
- T1* p1 = 0;
85
- T2* p2 = 0;
86
- T3* p3 = reinterpret_cast<T3*>(&value);
87
- D1 d1;
88
- A1 a1(allocator, size, &p2);
89
- shared_ptr<T> s1(p1, d1, a1);
90
- A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
91
- a2->set(0);
249
+
92
250
  #if !defined(BOOST_NO_CXX11_ALLOCATOR)
93
- boost::detail::as_init<T2, A, M>(allocator, p2, n1, p3);
251
+ #if !defined(BOOST_NO_EXCEPTIONS)
252
+ template<class A, class T>
253
+ inline void
254
+ sp_array_construct(A& allocator, T* storage, std::size_t size)
255
+ {
256
+ std::size_t i = 0;
257
+ try {
258
+ for (i = 0; i < size; ++i) {
259
+ std::allocator_traits<A>::construct(allocator, storage + i);
260
+ }
261
+ } catch (...) {
262
+ sp_array_destroy(allocator, storage, i);
263
+ throw;
264
+ }
265
+ }
266
+
267
+ template<class A, class T>
268
+ inline void
269
+ sp_array_construct(A& allocator, T* storage, std::size_t size,
270
+ const T* list, std::size_t count)
271
+ {
272
+ std::size_t i = 0;
273
+ try {
274
+ for (i = 0; i < size; ++i) {
275
+ std::allocator_traits<A>::construct(allocator, storage + i,
276
+ list[i % count]);
277
+ }
278
+ } catch (...) {
279
+ sp_array_destroy(allocator, storage, i);
280
+ throw;
281
+ }
282
+ }
94
283
  #else
95
- boost::detail::ms_init<T2, M>(p2, n1, p3);
284
+ template<class A, class T>
285
+ inline void
286
+ sp_array_construct(A& allocator, T* storage, std::size_t size)
287
+ {
288
+ for (std::size_t i = 0; i < size; ++i) {
289
+ std::allocator_traits<A>::construct(allocator, storage + i);
290
+ }
291
+ }
292
+
293
+ template<class A, class T>
294
+ inline void
295
+ sp_array_construct(A& allocator, T* storage, std::size_t size,
296
+ const T* list, std::size_t count)
297
+ {
298
+ for (std::size_t i = 0; i < size; ++i) {
299
+ std::allocator_traits<A>::construct(allocator, storage + i,
300
+ list[i % count]);
301
+ }
302
+ }
303
+ #endif
96
304
  #endif
97
- a2->set(p2);
98
- p1 = reinterpret_cast<T1*>(p2);
99
- return shared_ptr<T>(s1, p1);
100
- }
101
-
102
- template<class T, class A>
103
- inline typename boost::detail::sp_if_size_array<T>::type
104
- allocate_shared(const A& allocator,
105
- const typename boost::detail::array_inner<T>::type& value) {
106
- typedef typename boost::detail::array_inner<T>::type T1;
107
- typedef typename boost::detail::array_base<T1>::type T2;
108
- typedef const T2 T3;
109
- typedef boost::detail::ms_init_tag R1;
110
- typedef boost::detail::as_allocator<A, T, R1> A1;
111
- typedef boost::detail::ms_in_allocator_tag D1;
112
- enum {
113
- N = boost::detail::array_total<T>::size,
114
- M = boost::detail::array_total<T1>::size
115
- };
116
- T1* p1 = 0;
117
- T2* p2 = 0;
118
- T3* p3 = reinterpret_cast<T3*>(&value);
119
- D1 d1;
120
- A1 a1(allocator, &p2);
121
- shared_ptr<T> s1(p1, d1, a1);
122
- A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
123
- a2->set(0);
305
+
306
+ template<class T>
307
+ inline
308
+ typename sp_enable<boost::has_trivial_constructor<T>::value>::type
309
+ sp_array_default(T*, std::size_t) BOOST_NOEXCEPT { }
310
+
311
+ #if !defined(BOOST_NO_EXCEPTIONS)
312
+ template<class T>
313
+ inline
314
+ typename sp_enable<!boost::has_trivial_constructor<T>::value &&
315
+ boost::has_trivial_destructor<T>::value>::type
316
+ sp_array_default(T* storage, std::size_t size)
317
+ {
318
+ for (std::size_t i = 0; i < size; ++i) {
319
+ ::new(static_cast<void*>(storage + i)) T;
320
+ }
321
+ }
322
+
323
+ template<class T>
324
+ inline
325
+ typename sp_enable<!boost::has_trivial_constructor<T>::value &&
326
+ !boost::has_trivial_destructor<T>::value>::type
327
+ sp_array_default(T* storage, std::size_t size)
328
+ {
329
+ std::size_t i = 0;
330
+ try {
331
+ for (; i < size; ++i) {
332
+ ::new(static_cast<void*>(storage + i)) T;
333
+ }
334
+ } catch (...) {
335
+ while (i > 0) {
336
+ storage[--i].~T();
337
+ }
338
+ throw;
339
+ }
340
+ }
341
+ #else
342
+ template<class T>
343
+ inline
344
+ typename sp_enable<!boost::has_trivial_constructor<T>::value>::type
345
+ sp_array_default(T* storage, std::size_t size)
346
+ {
347
+ for (std::size_t i = 0; i < size; ++i) {
348
+ ::new(static_cast<void*>(storage + i)) T;
349
+ }
350
+ }
351
+ #endif
352
+
353
+ template<class T, std::size_t N>
354
+ struct sp_less_align {
355
+ enum {
356
+ value = (boost::alignment_of<T>::value) < N
357
+ };
358
+ };
359
+
360
+ template<class T, std::size_t N>
361
+ BOOST_CONSTEXPR inline
362
+ typename sp_enable<sp_less_align<T, N>::value, std::size_t>::type
363
+ sp_align(std::size_t size) BOOST_NOEXCEPT
364
+ {
365
+ return (sizeof(T) * size + N - 1) & ~(N - 1);
366
+ }
367
+
368
+ template<class T, std::size_t N>
369
+ BOOST_CONSTEXPR inline
370
+ typename sp_enable<!sp_less_align<T, N>::value, std::size_t>::type
371
+ sp_align(std::size_t size) BOOST_NOEXCEPT
372
+ {
373
+ return sizeof(T) * size;
374
+ }
375
+
376
+ template<class T>
377
+ BOOST_CONSTEXPR inline std::size_t
378
+ sp_types(std::size_t size) BOOST_NOEXCEPT
379
+ {
380
+ return (size + sizeof(T) - 1) / sizeof(T);
381
+ }
382
+
383
+ template<class T, std::size_t N>
384
+ class sp_size_array_deleter {
385
+ public:
386
+ template<class U>
387
+ static void operator_fn(U) BOOST_NOEXCEPT { }
388
+
389
+ sp_size_array_deleter() BOOST_NOEXCEPT
390
+ : enabled_(false) { }
391
+
392
+ template<class A>
393
+ sp_size_array_deleter(const A&) BOOST_NOEXCEPT
394
+ : enabled_(false) { }
395
+
396
+ sp_size_array_deleter(const sp_size_array_deleter&) BOOST_NOEXCEPT
397
+ : enabled_(false) { }
398
+
399
+ ~sp_size_array_deleter() {
400
+ if (enabled_) {
401
+ sp_array_destroy(reinterpret_cast<T*>(&storage_), N);
402
+ }
403
+ }
404
+
405
+ template<class U>
406
+ void operator()(U) {
407
+ if (enabled_) {
408
+ sp_array_destroy(reinterpret_cast<T*>(&storage_), N);
409
+ enabled_ = false;
410
+ }
411
+ }
412
+
413
+ void* construct() {
414
+ sp_array_construct(reinterpret_cast<T*>(&storage_), N);
415
+ enabled_ = true;
416
+ return &storage_;
417
+ }
418
+
419
+ void* construct(const T* list, std::size_t count) {
420
+ sp_array_construct(reinterpret_cast<T*>(&storage_), N,
421
+ list, count);
422
+ enabled_ = true;
423
+ return &storage_;
424
+ }
425
+
426
+ void* construct_default() {
427
+ sp_array_default(reinterpret_cast<T*>(&storage_), N);
428
+ enabled_ = true;
429
+ return &storage_;
430
+ }
431
+
432
+ private:
433
+ bool enabled_;
434
+ typename sp_array_storage<sizeof(T) * N,
435
+ boost::alignment_of<T>::value>::type storage_;
436
+ };
437
+
124
438
  #if !defined(BOOST_NO_CXX11_ALLOCATOR)
125
- boost::detail::as_init<T2, A, M>(allocator, p2, N, p3);
439
+ template<class T, std::size_t N, class A>
440
+ class sp_size_array_destroyer {
441
+ public:
442
+ template<class U>
443
+ static void operator_fn(U) BOOST_NOEXCEPT { }
444
+
445
+ template<class U>
446
+ sp_size_array_destroyer(const U& allocator) BOOST_NOEXCEPT
447
+ : allocator_(allocator),
448
+ enabled_(false) { }
449
+
450
+ sp_size_array_destroyer(const sp_size_array_destroyer& other)
451
+ BOOST_NOEXCEPT
452
+ : allocator_(other.allocator_),
453
+ enabled_(false) { }
454
+
455
+ ~sp_size_array_destroyer() {
456
+ if (enabled_) {
457
+ sp_array_destroy(allocator_,
458
+ reinterpret_cast<T*>(&storage_), N);
459
+ }
460
+ }
461
+
462
+ template<class U>
463
+ void operator()(U) {
464
+ if (enabled_) {
465
+ sp_array_destroy(allocator_,
466
+ reinterpret_cast<T*>(&storage_), N);
467
+ enabled_ = false;
468
+ }
469
+ }
470
+
471
+ void* construct() {
472
+ sp_array_construct(allocator_,
473
+ reinterpret_cast<T*>(&storage_), N);
474
+ enabled_ = true;
475
+ return &storage_;
476
+ }
477
+
478
+ void* construct(const T* list, std::size_t count) {
479
+ sp_array_construct(allocator_,
480
+ reinterpret_cast<T*>(&storage_), N, list, count);
481
+ enabled_ = true;
482
+ return &storage_;
483
+ }
484
+
485
+ const A& allocator() const BOOST_NOEXCEPT {
486
+ return allocator_;
487
+ }
488
+
489
+ private:
490
+ typename sp_array_storage<sizeof(T) * N,
491
+ boost::alignment_of<T>::value>::type storage_;
492
+ A allocator_;
493
+ bool enabled_;
494
+ };
495
+ #endif
496
+
497
+ template<class T>
498
+ class sp_array_deleter {
499
+ public:
500
+ template<class U>
501
+ static void operator_fn(U) BOOST_NOEXCEPT { }
502
+
503
+ sp_array_deleter(std::size_t size) BOOST_NOEXCEPT
504
+ : address_(0),
505
+ size_(size) { }
506
+
507
+ template<class A>
508
+ sp_array_deleter(const A& allocator) BOOST_NOEXCEPT
509
+ : address_(0),
510
+ size_(allocator.size()) { }
511
+
512
+ template<class A>
513
+ sp_array_deleter(const A&, std::size_t size) BOOST_NOEXCEPT
514
+ : address_(0),
515
+ size_(size) { }
516
+
517
+ sp_array_deleter(const sp_array_deleter& other) BOOST_NOEXCEPT
518
+ : address_(0),
519
+ size_(other.size_) { }
520
+
521
+ ~sp_array_deleter() {
522
+ if (address_) {
523
+ sp_array_destroy(static_cast<T*>(address_), size_);
524
+ }
525
+ }
526
+
527
+ template<class U>
528
+ void operator()(U) {
529
+ if (address_) {
530
+ sp_array_destroy(static_cast<T*>(address_), size_);
531
+ address_ = 0;
532
+ }
533
+ }
534
+
535
+ void construct(T* address) {
536
+ sp_array_construct(address, size_);
537
+ address_ = address;
538
+ }
539
+
540
+ void construct(T* address, const T* list, std::size_t count) {
541
+ sp_array_construct(address, size_, list, count);
542
+ address_ = address;
543
+ }
544
+
545
+ void construct_default(T* address) {
546
+ sp_array_default(address, size_);
547
+ address_ = address;
548
+ }
549
+
550
+ std::size_t size() const BOOST_NOEXCEPT {
551
+ return size_;
552
+ }
553
+
554
+ private:
555
+ void* address_;
556
+ std::size_t size_;
557
+ };
558
+
559
+ #if !defined(BOOST_NO_CXX11_ALLOCATOR)
560
+ template<class T, class A>
561
+ class sp_array_destroyer {
562
+ public:
563
+ template<class U>
564
+ static void operator_fn(U) BOOST_NOEXCEPT { }
565
+
566
+ template<class U>
567
+ sp_array_destroyer(const U& allocator, std::size_t size)
568
+ BOOST_NOEXCEPT
569
+ : allocator_(allocator),
570
+ size_(size),
571
+ address_(0) { }
572
+
573
+ template<class U>
574
+ sp_array_destroyer(const U& allocator) BOOST_NOEXCEPT
575
+ : allocator_(allocator.allocator()),
576
+ size_(allocator.size()),
577
+ address_(0) { }
578
+
579
+ sp_array_destroyer(const sp_array_destroyer& other) BOOST_NOEXCEPT
580
+ : allocator_(other.allocator_),
581
+ size_(other.size_),
582
+ address_(0) { }
583
+
584
+ ~sp_array_destroyer() {
585
+ if (address_) {
586
+ sp_array_destroy(allocator_, static_cast<T*>(address_),
587
+ size_);
588
+ }
589
+ }
590
+
591
+ template<class U>
592
+ void operator()(U) {
593
+ if (address_) {
594
+ sp_array_destroy(allocator_, static_cast<T*>(address_),
595
+ size_);
596
+ address_ = 0;
597
+ }
598
+ }
599
+
600
+ void construct(T* address) {
601
+ sp_array_construct(allocator_, address, size_);
602
+ address_ = address;
603
+ }
604
+
605
+ void construct(T* address, const T* list, std::size_t count) {
606
+ sp_array_construct(allocator_, address, size_, list, count);
607
+ address_ = address;
608
+ }
609
+
610
+ const A& allocator() const BOOST_NOEXCEPT {
611
+ return allocator_;
612
+ }
613
+
614
+ std::size_t size() const BOOST_NOEXCEPT {
615
+ return size_;
616
+ }
617
+
618
+ private:
619
+ A allocator_;
620
+ std::size_t size_;
621
+ void* address_;
622
+ };
623
+ #endif
624
+
625
+ template<class T, class A>
626
+ class sp_array_allocator {
627
+ template<class U, class V>
628
+ friend class sp_array_allocator;
629
+
630
+ public:
631
+ typedef typename A::value_type value_type;
632
+
633
+ private:
634
+ enum {
635
+ alignment = sp_max_size<boost::alignment_of<T>::value,
636
+ boost::alignment_of<value_type>::value>::value
637
+ };
638
+
639
+ typedef typename boost::type_with_alignment<alignment>::type type;
640
+ typedef typename sp_bind_allocator<A, type>::type type_allocator;
641
+
642
+ public:
643
+ template<class U>
644
+ struct rebind {
645
+ typedef sp_array_allocator<T,
646
+ typename sp_bind_allocator<A, U>::type> other;
647
+ };
648
+
649
+ sp_array_allocator(const A& allocator, std::size_t size,
650
+ void** result) BOOST_NOEXCEPT
651
+ : allocator_(allocator),
652
+ size_(size),
653
+ result_(result) { }
654
+
655
+ sp_array_allocator(const A& allocator, std::size_t size)
656
+ BOOST_NOEXCEPT
657
+ : allocator_(allocator),
658
+ size_(size) { }
659
+
660
+ template<class U>
661
+ sp_array_allocator(const sp_array_allocator<T, U>& other)
662
+ BOOST_NOEXCEPT
663
+ : allocator_(other.allocator_),
664
+ size_(other.size_),
665
+ result_(other.result_) { }
666
+
667
+ value_type* allocate(std::size_t count) {
668
+ type_allocator allocator(allocator_);
669
+ std::size_t node = sp_align<value_type, alignment>(count);
670
+ std::size_t size = sp_types<type>(node + sizeof(T) * size_);
671
+ type* address = allocator.allocate(size);
672
+ *result_ = reinterpret_cast<char*>(address) + node;
673
+ return reinterpret_cast<value_type*>(address);
674
+ }
675
+
676
+ void deallocate(value_type* value, std::size_t count) {
677
+ type_allocator allocator(allocator_);
678
+ std::size_t node = sp_align<value_type, alignment>(count);
679
+ std::size_t size = sp_types<type>(node + sizeof(T) * size_);
680
+ allocator.deallocate(reinterpret_cast<type*>(value), size);
681
+ }
682
+
683
+ const A& allocator() const BOOST_NOEXCEPT {
684
+ return allocator_;
685
+ }
686
+
687
+ std::size_t size() const BOOST_NOEXCEPT {
688
+ return size_;
689
+ }
690
+
691
+ private:
692
+ A allocator_;
693
+ std::size_t size_;
694
+ void** result_;
695
+ };
696
+
697
+ template<class T, class U, class V>
698
+ inline bool
699
+ operator==(const sp_array_allocator<T, U>& first,
700
+ const sp_array_allocator<T, V>& second) BOOST_NOEXCEPT
701
+ {
702
+ return first.allocator() == second.allocator() &&
703
+ first.size() == second.size();
704
+ }
705
+
706
+ template<class T, class U, class V>
707
+ inline bool
708
+ operator!=(const sp_array_allocator<T, U>& first,
709
+ const sp_array_allocator<T, V>& second) BOOST_NOEXCEPT
710
+ {
711
+ return !(first == second);
712
+ }
713
+
714
+ #if !defined(BOOST_NO_CXX11_ALLOCATOR)
715
+ template<class A, class T, std::size_t N>
716
+ struct sp_select_size_deleter {
717
+ typedef sp_size_array_destroyer<T, N,
718
+ typename sp_bind_allocator<A, T>::type> type;
719
+ };
720
+
721
+ template<class U, class T, std::size_t N>
722
+ struct sp_select_size_deleter<std::allocator<U>, T, N> {
723
+ typedef sp_size_array_deleter<T, N> type;
724
+ };
725
+
726
+ template<class A, class T>
727
+ struct sp_select_deleter {
728
+ typedef sp_array_destroyer<T,
729
+ typename sp_bind_allocator<A, T>::type> type;
730
+ };
731
+
732
+ template<class U, class T>
733
+ struct sp_select_deleter<std::allocator<U>, T> {
734
+ typedef sp_array_deleter<T> type;
735
+ };
126
736
  #else
127
- boost::detail::ms_init<T2, M>(p2, N, p3);
737
+ template<class, class T, std::size_t N>
738
+ struct sp_select_size_deleter {
739
+ typedef sp_size_array_deleter<T, N> type;
740
+ };
741
+
742
+ template<class, class T>
743
+ struct sp_select_deleter {
744
+ typedef sp_array_deleter<T> type;
745
+ };
746
+ #endif
747
+
748
+ template<class P, class T, std::size_t N, class A>
749
+ class sp_counted_impl_pda<P, sp_size_array_deleter<T, N>, A>
750
+ : public sp_counted_base {
751
+ public:
752
+ typedef sp_size_array_deleter<T, N> deleter_type;
753
+
754
+ private:
755
+ typedef sp_counted_impl_pda<P, deleter_type, A> type;
756
+ typedef typename sp_bind_allocator<A, type>::type deallocator;
757
+
758
+ public:
759
+ sp_counted_impl_pda(P, const deleter_type&, const A& allocator)
760
+ : deleter_(allocator),
761
+ allocator_(allocator) { }
762
+
763
+ sp_counted_impl_pda(P, const A& allocator)
764
+ : deleter_(allocator) { }
765
+
766
+ void dispose() {
767
+ deleter_(0);
768
+ }
769
+
770
+ void destroy() {
771
+ deallocator allocator(allocator_);
772
+ this->~type();
773
+ allocator.deallocate(this, 1);
774
+ }
775
+
776
+ void* get_deleter(const sp_typeinfo&) {
777
+ return &reinterpret_cast<char&>(deleter_);
778
+ }
779
+
780
+ void* get_untyped_deleter() {
781
+ return &reinterpret_cast<char&>(deleter_);
782
+ }
783
+
784
+ private:
785
+ deleter_type deleter_;
786
+ A allocator_;
787
+ };
788
+
789
+ #if !defined(BOOST_NO_CXX11_ALLOCATOR)
790
+ template<class P, class T, std::size_t N, class U, class A>
791
+ class sp_counted_impl_pda<P, sp_size_array_destroyer<T, N, U>, A>
792
+ : public sp_counted_base {
793
+ public:
794
+ typedef sp_size_array_destroyer<T, N, U> deleter_type;
795
+
796
+ private:
797
+ typedef sp_counted_impl_pda<P, deleter_type, A> type;
798
+ typedef typename sp_bind_allocator<A, type>::type deallocator;
799
+
800
+ public:
801
+ sp_counted_impl_pda(P, const deleter_type&, const A& allocator)
802
+ : deleter_(allocator) { }
803
+
804
+ sp_counted_impl_pda(P, const A& allocator)
805
+ : deleter_(allocator) { }
806
+
807
+ void dispose() {
808
+ deleter_(0);
809
+ }
810
+
811
+ void destroy() {
812
+ deallocator allocator(deleter_.allocator());
813
+ this->~type();
814
+ allocator.deallocate(this, 1);
815
+ }
816
+
817
+ void* get_deleter(const sp_typeinfo&) {
818
+ return &reinterpret_cast<char&>(deleter_);
819
+ }
820
+
821
+ void* get_untyped_deleter() {
822
+ return &reinterpret_cast<char&>(deleter_);
823
+ }
824
+
825
+ private:
826
+ deleter_type deleter_;
827
+ };
128
828
  #endif
129
- a2->set(p2);
130
- p1 = reinterpret_cast<T1*>(p2);
131
- return shared_ptr<T>(s1, p1);
132
- }
133
-
134
- template<class T, class A>
135
- inline typename boost::detail::sp_if_array<T>::type
136
- allocate_shared_noinit(const A& allocator, std::size_t size) {
137
- typedef typename boost::detail::array_inner<T>::type T1;
138
- typedef typename boost::detail::array_base<T1>::type T2;
139
- typedef boost::detail::ms_noinit_tag R1;
140
- typedef boost::detail::as_allocator<A, T, R1> A1;
141
- typedef boost::detail::ms_in_allocator_tag D1;
142
- std::size_t n1 = size * boost::detail::array_total<T1>::size;
143
- T1* p1 = 0;
144
- T2* p2 = 0;
145
- D1 d1;
146
- A1 a1(allocator, size, &p2);
147
- shared_ptr<T> s1(p1, d1, a1);
148
- A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
149
- a2->set(0);
150
- boost::detail::ms_noinit(p2, n1);
151
- a2->set(p2);
152
- p1 = reinterpret_cast<T1*>(p2);
153
- return shared_ptr<T>(s1, p1);
154
- }
155
-
156
- template<class T, class A>
157
- inline typename boost::detail::sp_if_size_array<T>::type
158
- allocate_shared_noinit(const A& allocator) {
159
- typedef typename boost::detail::array_inner<T>::type T1;
160
- typedef typename boost::detail::array_base<T1>::type T2;
161
- typedef boost::detail::ms_noinit_tag R1;
162
- typedef boost::detail::as_allocator<A, T, R1> A1;
163
- typedef boost::detail::ms_in_allocator_tag D1;
164
- enum {
165
- N = boost::detail::array_total<T>::size
166
- };
167
- T1* p1 = 0;
168
- T2* p2 = 0;
169
- D1 d1;
170
- A1 a1(allocator, &p2);
171
- shared_ptr<T> s1(p1, d1, a1);
172
- A1* a2 = static_cast<A1*>(s1._internal_get_untyped_deleter());
173
- a2->set(0);
174
- boost::detail::ms_noinit(p2, N);
175
- a2->set(p2);
176
- p1 = reinterpret_cast<T1*>(p2);
177
- return shared_ptr<T>(s1, p1);
829
+
830
+ template<class P, class T, class A>
831
+ class sp_counted_impl_pda<P, sp_array_deleter<T>,
832
+ sp_array_allocator<T, A> >
833
+ : public sp_counted_base {
834
+ public:
835
+ typedef sp_array_deleter<T> deleter_type;
836
+ typedef sp_array_allocator<T, A> allocator_type;
837
+
838
+ private:
839
+ typedef sp_counted_impl_pda<P, deleter_type, allocator_type> type;
840
+ typedef sp_array_allocator<T,
841
+ typename sp_bind_allocator<A, type>::type> deallocator;
842
+
843
+ public:
844
+ sp_counted_impl_pda(P, const deleter_type&,
845
+ const allocator_type& allocator)
846
+ : deleter_(allocator),
847
+ allocator_(allocator.allocator()) { }
848
+
849
+ sp_counted_impl_pda(P, const allocator_type& allocator)
850
+ : deleter_(allocator),
851
+ allocator_(allocator.allocator()) { }
852
+
853
+ void dispose() {
854
+ deleter_(0);
855
+ }
856
+
857
+ void destroy() {
858
+ deallocator allocator(allocator_, deleter_.size());
859
+ this->~type();
860
+ allocator.deallocate(this, 1);
861
+ }
862
+
863
+ void* get_deleter(const sp_typeinfo&) {
864
+ return &reinterpret_cast<char&>(deleter_);
865
+ }
866
+
867
+ void* get_untyped_deleter() {
868
+ return &reinterpret_cast<char&>(deleter_);
869
+ }
870
+
871
+ private:
872
+ deleter_type deleter_;
873
+ A allocator_;
874
+ };
875
+
876
+ #if !defined(BOOST_NO_CXX11_ALLOCATOR)
877
+ template<class P, class T, class U, class A>
878
+ class sp_counted_impl_pda<P, sp_array_destroyer<T, U>,
879
+ sp_array_allocator<T, A> >
880
+ : public sp_counted_base {
881
+ public:
882
+ typedef sp_array_destroyer<T, U> deleter_type;
883
+ typedef sp_array_allocator<T, A> allocator_type;
884
+
885
+ private:
886
+ typedef sp_counted_impl_pda<P, deleter_type, allocator_type> type;
887
+ typedef sp_array_allocator<T,
888
+ typename sp_bind_allocator<A, type>::type> deallocator;
889
+
890
+ public:
891
+ sp_counted_impl_pda(P, const deleter_type&,
892
+ const allocator_type& allocator)
893
+ : deleter_(allocator) { }
894
+
895
+ sp_counted_impl_pda(P, const allocator_type& allocator)
896
+ : deleter_(allocator) { }
897
+
898
+ void dispose() {
899
+ deleter_(0);
900
+ }
901
+
902
+ void destroy() {
903
+ deallocator allocator(deleter_.allocator(), deleter_.size());
904
+ this->~type();
905
+ allocator.deallocate(this, 1);
906
+ }
907
+
908
+ void* get_deleter(const sp_typeinfo&) {
909
+ return &reinterpret_cast<char&>(deleter_);
910
+ }
911
+
912
+ void* get_untyped_deleter() {
913
+ return &reinterpret_cast<char&>(deleter_);
178
914
  }
915
+
916
+ private:
917
+ deleter_type deleter_;
918
+ };
919
+ #endif
920
+
921
+ } /* detail */
922
+
923
+ template<class T, class A>
924
+ inline typename detail::sp_if_size_array<T>::type
925
+ allocate_shared(const A& allocator)
926
+ {
927
+ typedef typename detail::sp_array_element<T>::type type;
928
+ typedef typename detail::sp_array_scalar<T>::type scalar;
929
+ typedef typename detail::sp_select_size_deleter<A, scalar,
930
+ detail::sp_array_count<T>::value>::type deleter;
931
+ shared_ptr<T> result(static_cast<type*>(0),
932
+ detail::sp_inplace_tag<deleter>(), allocator);
933
+ deleter* state = detail::sp_get_deleter<deleter>(result);
934
+ void* start = state->construct();
935
+ return shared_ptr<T>(result, static_cast<type*>(start));
936
+ }
937
+
938
+ template<class T, class A>
939
+ inline typename detail::sp_if_size_array<T>::type
940
+ allocate_shared(const A& allocator,
941
+ const typename detail::sp_array_element<T>::type& value)
942
+ {
943
+ typedef typename detail::sp_array_element<T>::type type;
944
+ typedef typename detail::sp_array_scalar<T>::type scalar;
945
+ typedef typename detail::sp_select_size_deleter<A, scalar,
946
+ detail::sp_array_count<T>::value>::type deleter;
947
+ shared_ptr<T> result(static_cast<type*>(0),
948
+ detail::sp_inplace_tag<deleter>(), allocator);
949
+ deleter* state = detail::sp_get_deleter<deleter>(result);
950
+ void* start = state->construct(reinterpret_cast<const
951
+ scalar*>(&value), detail::sp_array_count<type>::value);
952
+ return shared_ptr<T>(result, static_cast<type*>(start));
953
+ }
954
+
955
+ template<class T, class A>
956
+ inline typename detail::sp_if_size_array<T>::type
957
+ allocate_shared_noinit(const A& allocator)
958
+ {
959
+ typedef typename detail::sp_array_element<T>::type type;
960
+ typedef typename detail::sp_array_scalar<T>::type scalar;
961
+ typedef detail::sp_size_array_deleter<scalar,
962
+ detail::sp_array_count<T>::value> deleter;
963
+ shared_ptr<T> result(static_cast<type*>(0),
964
+ detail::sp_inplace_tag<deleter>(), allocator);
965
+ deleter* state = detail::sp_get_deleter<deleter>(result);
966
+ void* start = state->construct_default();
967
+ return shared_ptr<T>(result, static_cast<type*>(start));
179
968
  }
180
969
 
970
+ template<class T, class A>
971
+ inline typename detail::sp_if_array<T>::type
972
+ allocate_shared(const A& allocator, std::size_t count)
973
+ {
974
+ typedef typename detail::sp_array_element<T>::type type;
975
+ typedef typename detail::sp_array_scalar<T>::type scalar;
976
+ typedef typename detail::sp_select_deleter<A, scalar>::type deleter;
977
+ std::size_t size = count * detail::sp_array_count<type>::value;
978
+ void* start;
979
+ shared_ptr<T> result(static_cast<type*>(0),
980
+ detail::sp_inplace_tag<deleter>(),
981
+ detail::sp_array_allocator<scalar, A>(allocator, size, &start));
982
+ deleter* state = detail::sp_get_deleter<deleter>(result);
983
+ state->construct(static_cast<scalar*>(start));
984
+ return shared_ptr<T>(result, static_cast<type*>(start));
985
+ }
986
+
987
+ template<class T, class A>
988
+ inline typename detail::sp_if_array<T>::type
989
+ allocate_shared(const A& allocator, std::size_t count,
990
+ const typename detail::sp_array_element<T>::type& value)
991
+ {
992
+ typedef typename detail::sp_array_element<T>::type type;
993
+ typedef typename detail::sp_array_scalar<T>::type scalar;
994
+ typedef typename detail::sp_select_deleter<A, scalar>::type deleter;
995
+ std::size_t size = count * detail::sp_array_count<type>::value;
996
+ void* start;
997
+ shared_ptr<T> result(static_cast<type*>(0),
998
+ detail::sp_inplace_tag<deleter>(),
999
+ detail::sp_array_allocator<scalar, A>(allocator, size, &start));
1000
+ deleter* state = detail::sp_get_deleter<deleter>(result);
1001
+ state->construct(static_cast<scalar*>(start),
1002
+ reinterpret_cast<const scalar*>(&value),
1003
+ detail::sp_array_count<type>::value);
1004
+ return shared_ptr<T>(result, static_cast<type*>(start));
1005
+ }
1006
+
1007
+ template<class T, class A>
1008
+ inline typename detail::sp_if_array<T>::type
1009
+ allocate_shared_noinit(const A& allocator, std::size_t count)
1010
+ {
1011
+ typedef typename detail::sp_array_element<T>::type type;
1012
+ typedef typename detail::sp_array_scalar<T>::type scalar;
1013
+ typedef detail::sp_array_deleter<scalar> deleter;
1014
+ std::size_t size = count * detail::sp_array_count<type>::value;
1015
+ void* start;
1016
+ shared_ptr<T> result(static_cast<type*>(0),
1017
+ detail::sp_inplace_tag<deleter>(),
1018
+ detail::sp_array_allocator<scalar, A>(allocator, size, &start));
1019
+ deleter* state = detail::sp_get_deleter<deleter>(result);
1020
+ state->construct_default(static_cast<scalar*>(start));
1021
+ return shared_ptr<T>(result, static_cast<type*>(start));
1022
+ }
1023
+
1024
+ } /* boost */
1025
+
181
1026
  #endif