passenger 6.1.0 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +32 -2
  3. data/Rakefile +6 -13
  4. data/bin/passenger-install-apache2-module +15 -19
  5. data/bin/passenger-install-nginx-module +42 -44
  6. data/bin/passenger-status +9 -10
  7. data/build/common_library.rb +4 -4
  8. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +1 -1
  9. data/build/test_basics.rb +4 -3
  10. data/dev/copy_boost_headers +54 -40
  11. data/dev/ruby_server.rb +1 -1
  12. data/src/agent/Core/Config.h +1 -1
  13. data/src/agent/Core/Controller/Config.h +1 -1
  14. data/src/agent/Watchdog/Config.h +1 -1
  15. data/src/cxx_supportlib/Constants.h +1 -1
  16. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +8 -1
  17. data/src/cxx_supportlib/vendor-modified/boost/assert.hpp +6 -0
  18. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic.hpp +94 -110
  19. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic_flag.hpp +2 -2
  20. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic_ref.hpp +14 -14
  21. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/addressof.hpp +3 -3
  22. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_flag_impl.hpp +52 -24
  23. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_impl.hpp +641 -285
  24. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_ref_impl.hpp +593 -260
  25. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_cast.hpp +37 -24
  26. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_fp_cast.hpp +9 -9
  27. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/cas_based_exchange.hpp +3 -3
  28. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/chrono.hpp +93 -0
  29. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/classify.hpp +16 -17
  30. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/config.hpp +25 -34
  31. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_aarch32.hpp +204 -97
  32. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_aarch64.hpp +251 -122
  33. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_alpha.hpp +56 -56
  34. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_arm.hpp +129 -129
  35. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_ppc.hpp +253 -125
  36. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_sparc.hpp +25 -25
  37. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +193 -126
  38. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_arm.hpp +57 -57
  39. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_x86.hpp +96 -97
  40. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_operations_emulated.hpp +24 -24
  41. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_cas_based.hpp +10 -10
  42. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_gcc_atomic.hpp +27 -24
  43. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_gcc_sync.hpp +39 -37
  44. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_ops_linux_arm.hpp +17 -17
  45. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extending_cas_based_arithmetic.hpp +5 -5
  46. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_fp_ops_emulated.hpp +12 -12
  47. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_fp_ops_generic.hpp +21 -21
  48. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_emulated.hpp +30 -30
  49. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_aarch32.hpp +170 -98
  50. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_aarch64.hpp +209 -119
  51. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_arm.hpp +95 -95
  52. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_ppc.hpp +148 -76
  53. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_gcc_x86.hpp +293 -123
  54. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_generic.hpp +87 -71
  55. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_msvc_arm.hpp +5 -5
  56. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/extra_ops_msvc_x86.hpp +88 -88
  57. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_operations.hpp +2 -2
  58. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_aarch32.hpp +4 -5
  59. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_aarch64.hpp +4 -4
  60. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_alpha.hpp +4 -4
  61. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_arm.hpp +9 -9
  62. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_ppc.hpp +4 -4
  63. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_sparc.hpp +4 -4
  64. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_gcc_x86.hpp +4 -4
  65. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_msvc_arm.hpp +5 -5
  66. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_arch_ops_msvc_x86.hpp +6 -6
  67. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_operations.hpp +2 -2
  68. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_operations_emulated.hpp +2 -2
  69. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_gcc_atomic.hpp +5 -5
  70. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_gcc_sync.hpp +4 -4
  71. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fence_ops_linux_arm.hpp +7 -7
  72. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fp_ops_emulated.hpp +7 -7
  73. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/fp_ops_generic.hpp +6 -6
  74. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/futex.hpp +110 -49
  75. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/gcc_atomic_memory_order_utils.hpp +1 -1
  76. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/has_posix_clock_traits.hpp +51 -0
  77. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/int_sizes.hpp +26 -32
  78. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/integral_conversions.hpp +15 -15
  79. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/interlocked.hpp +69 -30
  80. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/intptr.hpp +8 -8
  81. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/lock_pool.hpp +51 -31
  82. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/memory_order_utils.hpp +2 -2
  83. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/once_flag.hpp +2 -2
  84. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_arm_common.hpp +6 -6
  85. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_ppc_common.hpp +4 -4
  86. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/platform.hpp +5 -5
  87. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/storage_traits.hpp +31 -31
  88. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/alignment_of.hpp +2 -3
  89. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/has_unique_object_representations.hpp +2 -5
  90. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_floating_point.hpp +3 -3
  91. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_iec559.hpp +2 -2
  92. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_integral.hpp +3 -3
  93. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_signed.hpp +3 -3
  94. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_trivially_copyable.hpp +20 -13
  95. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_trivially_default_constructible.hpp +13 -13
  96. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/make_signed.hpp +3 -3
  97. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/make_unsigned.hpp +3 -3
  98. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_darwin_ulock.hpp +90 -16
  99. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_dragonfly_umtx.hpp +80 -11
  100. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_emulated.hpp +160 -15
  101. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_freebsd_umtx.hpp +327 -38
  102. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_futex.hpp +276 -33
  103. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_ops_generic.hpp +260 -20
  104. data/src/cxx_supportlib/vendor-modified/boost/atomic/fences.hpp +4 -3
  105. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic.hpp +14 -18
  106. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic_flag.hpp +2 -2
  107. data/src/cxx_supportlib/vendor-modified/boost/atomic/ipc_atomic_ref.hpp +13 -13
  108. data/src/cxx_supportlib/vendor-modified/boost/atomic/posix_clock_traits_fwd.hpp +59 -0
  109. data/src/cxx_supportlib/vendor-modified/boost/atomic/thread_pause.hpp +102 -0
  110. data/src/cxx_supportlib/vendor-modified/boost/atomic/wait_result.hpp +56 -0
  111. data/src/cxx_supportlib/vendor-modified/boost/atomic.hpp +4 -1
  112. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +5 -0
  113. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +1 -1
  114. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +108 -41
  115. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +1235 -1009
  116. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +3 -2
  117. data/src/cxx_supportlib/vendor-modified/boost/container/detail/algorithm.hpp +56 -0
  118. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_helpers.hpp +1 -0
  119. data/src/cxx_supportlib/vendor-modified/boost/container/detail/alloc_lib.h +9 -9
  120. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +23 -2
  121. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +0 -1
  122. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +88 -23
  123. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +2 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +2 -2
  125. data/src/cxx_supportlib/vendor-modified/boost/container/detail/operator_new_helpers.hpp +68 -0
  126. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +72 -13
  127. data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +13 -0
  128. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +8 -5
  129. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +31 -10
  130. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +37 -10
  131. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +19 -0
  132. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +23 -1
  133. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +72 -5
  134. data/src/cxx_supportlib/vendor-modified/boost/container/new_allocator.hpp +3 -10
  135. data/src/cxx_supportlib/vendor-modified/boost/container/options.hpp +54 -23
  136. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/devector.hpp +6 -4
  137. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +19 -0
  138. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +32 -5
  139. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +27 -2
  140. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +22 -0
  141. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +37 -17
  142. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +23 -1
  143. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +41 -20
  144. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +5 -8
  145. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_fwd.hpp +3 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_is_avalanching.hpp +57 -0
  147. data/src/cxx_supportlib/vendor-modified/boost/core/bit.hpp +29 -29
  148. data/src/cxx_supportlib/vendor-modified/boost/core/cmath.hpp +3 -3
  149. data/src/cxx_supportlib/vendor-modified/boost/core/data.hpp +15 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/core/default_allocator.hpp +1 -0
  151. data/src/cxx_supportlib/vendor-modified/boost/core/demangle.hpp +1 -1
  152. data/src/cxx_supportlib/vendor-modified/boost/core/detail/assert.hpp +18 -0
  153. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_sleep.hpp +2 -2
  154. data/src/cxx_supportlib/vendor-modified/boost/core/detail/static_assert.hpp +42 -0
  155. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +16 -10
  156. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +35 -27
  157. data/src/cxx_supportlib/vendor-modified/boost/core/scoped_enum.hpp +1 -1
  158. data/src/cxx_supportlib/vendor-modified/boost/core/size.hpp +14 -0
  159. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +20 -9
  160. data/src/cxx_supportlib/vendor-modified/boost/cregex.hpp +0 -5
  161. data/src/cxx_supportlib/vendor-modified/boost/describe/detail/config.hpp +8 -0
  162. data/src/cxx_supportlib/vendor-modified/boost/describe/modifiers.hpp +1 -1
  163. data/src/cxx_supportlib/vendor-modified/boost/foreach.hpp +1 -0
  164. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/ebo_functor_holder.hpp +4 -4
  165. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +2 -2
  166. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_rebind.hpp +9 -0
  167. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +1 -0
  168. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +2 -2
  169. data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +43 -64
  170. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/config_def.hpp +0 -83
  171. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/config_undef.hpp +1 -5
  172. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/eval_if_default.hpp +44 -0
  173. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/facade_iterator_category.hpp +103 -117
  174. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/conjunction.hpp +53 -0
  175. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/disjunction.hpp +53 -0
  176. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/negation.hpp +53 -0
  177. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/type_traits/type_identity.hpp +54 -0
  178. data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +32 -38
  179. data/src/cxx_supportlib/vendor-modified/boost/iterator/enable_if_convertible.hpp +84 -0
  180. data/src/cxx_supportlib/vendor-modified/boost/iterator/interoperable.hpp +22 -34
  181. data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +16 -16
  182. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_adaptor.hpp +162 -309
  183. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_categories.hpp +52 -161
  184. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_concepts.hpp +3 -11
  185. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_facade.hpp +804 -977
  186. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_traits.hpp +24 -17
  187. data/src/cxx_supportlib/vendor-modified/boost/iterator/min_category.hpp +83 -0
  188. data/src/cxx_supportlib/vendor-modified/boost/iterator/minimum_category.hpp +11 -73
  189. data/src/cxx_supportlib/vendor-modified/boost/iterator/reverse_iterator.hpp +56 -57
  190. data/src/cxx_supportlib/vendor-modified/boost/iterator/transform_iterator.hpp +123 -156
  191. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +1 -1
  192. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/buffer_view.hpp +1 -1
  193. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +36 -33
  194. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +43 -50
  195. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +23 -27
  196. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +1 -1
  197. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +10 -11
  198. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_basic_unlockedbuf.hpp +1 -1
  199. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
  200. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +6 -7
  201. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/type_traits.hpp +81 -0
  202. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +4 -4
  203. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +8 -9
  204. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +1 -1
  205. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/wide_posix_api.cpp +1 -12
  206. data/src/cxx_supportlib/vendor-modified/boost/memory_order.hpp +8 -26
  207. data/src/cxx_supportlib/vendor-modified/boost/move/detail/iterator_to_raw_pointer.hpp +1 -1
  208. data/src/cxx_supportlib/vendor-modified/boost/move/detail/launder.hpp +1 -1
  209. data/src/cxx_supportlib/vendor-modified/boost/move/detail/std_ns_begin.hpp +6 -0
  210. data/src/cxx_supportlib/vendor-modified/boost/move/detail/unique_ptr_meta_utils.hpp +2 -2
  211. data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +11 -44
  212. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +34 -0
  213. data/src/cxx_supportlib/vendor-modified/boost/mp11/set.hpp +33 -1
  214. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/mpl/and.hpp +4 -8
  216. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/na_assert.hpp +1 -1
  217. data/src/cxx_supportlib/vendor-modified/boost/mpl/aux_/ptr_to_ref.hpp +1 -1
  218. data/src/cxx_supportlib/vendor-modified/boost/mpl/bitand.hpp +2 -6
  219. data/src/cxx_supportlib/vendor-modified/boost/mpl/bitor.hpp +2 -6
  220. data/src/cxx_supportlib/vendor-modified/boost/mpl/or.hpp +2 -6
  221. data/src/cxx_supportlib/vendor-modified/boost/pool/pool.hpp +1 -1
  222. data/src/cxx_supportlib/vendor-modified/boost/pool/simple_segregated_storage.hpp +0 -13
  223. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/tuple/limits/to_seq_256.hpp +190 -190
  224. data/src/cxx_supportlib/vendor-modified/boost/random/beta_distribution.hpp +12 -2
  225. data/src/cxx_supportlib/vendor-modified/boost/random/detail/config.hpp +4 -0
  226. data/src/cxx_supportlib/vendor-modified/boost/random/detail/size.hpp +41 -0
  227. data/src/cxx_supportlib/vendor-modified/boost/random/detail/xoshiro_base.hpp +472 -0
  228. data/src/cxx_supportlib/vendor-modified/boost/random/discrete_distribution.hpp +7 -10
  229. data/src/cxx_supportlib/vendor-modified/boost/random/gamma_distribution.hpp +1 -1
  230. data/src/cxx_supportlib/vendor-modified/boost/random/generalized_inverse_gaussian_distribution.hpp +339 -0
  231. data/src/cxx_supportlib/vendor-modified/boost/random/hyperexponential_distribution.hpp +12 -14
  232. data/src/cxx_supportlib/vendor-modified/boost/random/inverse_gaussian_distribution.hpp +226 -0
  233. data/src/cxx_supportlib/vendor-modified/boost/random/mersenne_twister.hpp +1 -4
  234. data/src/cxx_supportlib/vendor-modified/boost/random/mixmax.hpp +63 -63
  235. data/src/cxx_supportlib/vendor-modified/boost/random/piecewise_constant_distribution.hpp +7 -10
  236. data/src/cxx_supportlib/vendor-modified/boost/random/piecewise_linear_distribution.hpp +8 -11
  237. data/src/cxx_supportlib/vendor-modified/boost/random/seed_seq.hpp +1 -3
  238. data/src/cxx_supportlib/vendor-modified/boost/random/splitmix64.hpp +1 -4
  239. data/src/cxx_supportlib/vendor-modified/boost/random/xoshiro.hpp +488 -0
  240. data/src/cxx_supportlib/vendor-modified/boost/random.hpp +3 -0
  241. data/src/cxx_supportlib/vendor-modified/boost/range/concepts.hpp +2 -0
  242. data/src/cxx_supportlib/vendor-modified/boost/range/detail/has_member_size.hpp +1 -0
  243. data/src/cxx_supportlib/vendor-modified/boost/range/detail/msvc_has_iterator_workaround.hpp +2 -0
  244. data/src/cxx_supportlib/vendor-modified/boost/range/has_range_iterator.hpp +1 -1
  245. data/src/cxx_supportlib/vendor-modified/boost/range/iterator.hpp +1 -0
  246. data/src/cxx_supportlib/vendor-modified/boost/range/iterator_range_core.hpp +4 -1
  247. data/src/cxx_supportlib/vendor-modified/boost/range/size_type.hpp +1 -1
  248. data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +35 -18
  249. data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +18 -101
  250. data/src/cxx_supportlib/vendor-modified/boost/regex/pattern_except.hpp +0 -4
  251. data/src/cxx_supportlib/vendor-modified/boost/regex/pending/object_cache.hpp +0 -4
  252. data/src/cxx_supportlib/vendor-modified/boost/regex/pending/unicode_iterator.hpp +0 -6
  253. data/src/cxx_supportlib/vendor-modified/boost/regex/regex_traits.hpp +0 -4
  254. data/src/cxx_supportlib/vendor-modified/boost/regex/user.hpp +4 -10
  255. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex.hpp +63 -17
  256. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex_creator.hpp +71 -16
  257. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/basic_regex_parser.hpp +22 -1
  258. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/c_regex_traits.hpp +11 -4
  259. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/char_regex_traits.hpp +2 -0
  260. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/cpp_regex_traits.hpp +11 -8
  261. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/cregex.hpp +2 -1
  262. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/error_type.hpp +1 -1
  263. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/icu.hpp +40 -38
  264. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/iterator_category.hpp +2 -0
  265. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/iterator_traits.hpp +4 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/match_flags.hpp +39 -37
  267. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/match_results.hpp +46 -9
  268. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/mem_block_cache.hpp +4 -0
  269. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/object_cache.hpp +2 -0
  270. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/pattern_except.hpp +6 -4
  271. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher.hpp +57 -8
  272. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher_common.hpp +21 -6
  273. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/perl_matcher_non_recursive.hpp +18 -3
  274. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regbase.hpp +4 -2
  275. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex.hpp +6 -6
  276. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_format.hpp +23 -18
  277. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_fwd.hpp +9 -9
  278. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_grep.hpp +9 -5
  279. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_iterator.hpp +11 -7
  280. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_match.hpp +10 -7
  281. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_merge.hpp +4 -4
  282. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_raw_buffer.hpp +3 -0
  283. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_replace.hpp +6 -2
  284. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_search.hpp +12 -9
  285. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_split.hpp +6 -3
  286. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_token_iterator.hpp +16 -11
  287. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_traits.hpp +1 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_traits_defaults.hpp +2 -0
  289. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_workaround.hpp +2 -0
  290. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/states.hpp +7 -0
  291. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/sub_match.hpp +54 -49
  292. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/syntax_type.hpp +64 -62
  293. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/u32regex_iterator.hpp +16 -0
  294. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/u32regex_token_iterator.hpp +12 -0
  295. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/unicode_iterator.hpp +6 -4
  296. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/w32_regex_traits.hpp +3 -1
  297. data/src/cxx_supportlib/vendor-modified/boost/regex.hpp +0 -4
  298. data/src/cxx_supportlib/vendor-modified/boost/regex_fwd.hpp +0 -4
  299. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count.hpp +1 -43
  300. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/deprecated_macros.hpp +7 -7
  301. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/shared_count.hpp +2 -77
  302. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base.hpp +1 -64
  303. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_nt.hpp +3 -3
  304. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +0 -77
  305. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_cxx20_constexpr.hpp +37 -0
  306. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock.hpp +5 -28
  307. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ptr.hpp +41 -40
  308. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_array.hpp +0 -15
  309. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_ptr.hpp +0 -18
  310. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_ptr.hpp +1 -1
  311. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +1 -1
  312. data/src/cxx_supportlib/vendor-modified/boost/tuple/detail/tuple_basic.hpp +1 -0
  313. data/src/cxx_supportlib/vendor-modified/boost/type_traits/integral_constant.hpp +8 -6
  314. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_complete.hpp +31 -10
  315. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fca.hpp +34 -8
  316. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/core.hpp +6 -4
  317. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +9 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +5 -5
  319. data/src/cxx_supportlib/vendor-modified/boost/unordered/{unordered_printers.hpp → detail/unordered_printers.hpp} +34 -36
  320. data/src/cxx_supportlib/vendor-modified/boost/unordered/hash_traits.hpp +6 -49
  321. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +6 -1
  322. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +6 -1
  323. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +6 -1
  324. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +6 -1
  325. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  326. data/src/nginx_module/ContentHandler.c +2 -0
  327. data/src/ruby_supportlib/phusion_passenger/config/download_agent_command.rb +3 -5
  328. data/src/ruby_supportlib/phusion_passenger/config/download_nginx_engine_command.rb +3 -5
  329. data/src/ruby_supportlib/phusion_passenger/config/install_agent_command.rb +3 -5
  330. data/src/ruby_supportlib/phusion_passenger/config/install_standalone_runtime_command.rb +3 -5
  331. data/src/ruby_supportlib/phusion_passenger/config/installation_utils.rb +1 -1
  332. data/src/ruby_supportlib/phusion_passenger/config/nginx_engine_compiler.rb +2 -2
  333. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +5 -3
  334. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +2 -2
  335. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +6 -13
  336. data/src/ruby_supportlib/phusion_passenger/platform_info/cxx_portability.rb +29 -30
  337. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +2 -3
  338. data/src/ruby_supportlib/phusion_passenger/standalone/config_utils.rb +2 -0
  339. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +1 -1
  340. data/src/ruby_supportlib/phusion_passenger/utils/json.rb +1 -1
  341. data/src/ruby_supportlib/phusion_passenger/utils/terminal_choice_menu.rb +1 -1
  342. data/src/ruby_supportlib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +1 -1
  343. data/src/ruby_supportlib/phusion_passenger.rb +8 -8
  344. metadata +26 -99
  345. data/src/cxx_supportlib/vendor-modified/boost/align/aligned_alloc.hpp +0 -47
  346. data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc_posix.hpp +0 -41
  347. data/src/cxx_supportlib/vendor-modified/boost/align/detail/aligned_alloc_sunos.hpp +0 -34
  348. data/src/cxx_supportlib/vendor-modified/boost/align/detail/is_alignment.hpp +0 -28
  349. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/pause.hpp +0 -68
  350. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/conditional.hpp +0 -42
  351. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/integral_constant.hpp +0 -46
  352. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_enum.hpp +0 -42
  353. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_function.hpp +0 -42
  354. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/is_nothrow_default_constructible.hpp +0 -46
  355. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/remove_cv.hpp +0 -42
  356. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/wait_on_address.hpp +0 -64
  357. data/src/cxx_supportlib/vendor-modified/boost/cerrno.hpp +0 -15
  358. data/src/cxx_supportlib/vendor-modified/boost/detail/indirect_traits.hpp +0 -195
  359. data/src/cxx_supportlib/vendor-modified/boost/detail/select_type.hpp +0 -36
  360. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/enable_if.hpp +0 -83
  361. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/internals.hpp +0 -35
  362. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex.cpp +0 -120
  363. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/regex_debug.cpp +0 -59
  364. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/static_mutex.cpp +0 -189
  365. data/src/cxx_supportlib/vendor-modified/boost/libs/system/src/error_code.cpp +0 -31
  366. data/src/cxx_supportlib/vendor-modified/boost/regex/config/borland.hpp +0 -72
  367. data/src/cxx_supportlib/vendor-modified/boost/regex/config/cwchar.hpp +0 -207
  368. data/src/cxx_supportlib/vendor-modified/boost/regex/pending/static_mutex.hpp +0 -182
  369. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex.hpp +0 -797
  370. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +0 -1598
  371. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +0 -3174
  372. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/c_regex_traits.hpp +0 -511
  373. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/char_regex_traits.hpp +0 -81
  374. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cpp_regex_traits.hpp +0 -1237
  375. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/cregex.hpp +0 -213
  376. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/error_type.hpp +0 -59
  377. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/icu.hpp +0 -1516
  378. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/indexed_bit_flag.hpp +0 -54
  379. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/iterator_category.hpp +0 -91
  380. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/iterator_traits.hpp +0 -135
  381. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +0 -161
  382. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_results.hpp +0 -716
  383. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/mem_block_cache.hpp +0 -183
  384. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/object_cache.hpp +0 -171
  385. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/pattern_except.hpp +0 -128
  386. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +0 -645
  387. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +0 -1030
  388. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +0 -1947
  389. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_recursive.hpp +0 -1131
  390. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/primary_transform.hpp +0 -146
  391. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/protected_call.hpp +0 -83
  392. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regbase.hpp +0 -180
  393. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex.hpp +0 -166
  394. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +0 -1158
  395. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_fwd.hpp +0 -73
  396. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_grep.hpp +0 -155
  397. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_iterator.hpp +0 -195
  398. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_match.hpp +0 -382
  399. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_merge.hpp +0 -93
  400. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_raw_buffer.hpp +0 -241
  401. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_replace.hpp +0 -99
  402. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_search.hpp +0 -217
  403. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_split.hpp +0 -174
  404. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_token_iterator.hpp +0 -327
  405. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits.hpp +0 -189
  406. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +0 -997
  407. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +0 -237
  408. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/states.hpp +0 -321
  409. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/sub_match.hpp +0 -516
  410. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/syntax_type.hpp +0 -105
  411. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_iterator.hpp +0 -185
  412. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_token_iterator.hpp +0 -360
  413. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/unicode_iterator.hpp +0 -871
  414. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +0 -1229
  415. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_gcc.hpp +0 -79
  416. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_gcc_atomic.hpp +0 -63
  417. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp +0 -88
  418. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_pt.hpp +0 -104
  419. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_spin.hpp +0 -69
  420. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/atomic_count_sync.hpp +0 -72
  421. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +0 -163
  422. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_aix.hpp +0 -152
  423. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +0 -185
  424. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp +0 -148
  425. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +0 -170
  426. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +0 -200
  427. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +0 -194
  428. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +0 -179
  429. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +0 -186
  430. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_pt.hpp +0 -147
  431. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +0 -174
  432. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_spin.hpp +0 -141
  433. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_sync.hpp +0 -165
  434. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +0 -163
  435. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_gcc_intrinsics.hpp +0 -30
  436. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_has_sync_intrinsics.hpp +0 -69
  437. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +0 -128
  438. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_nt.hpp +0 -96
  439. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_pt.hpp +0 -86
  440. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/spinlock_sync.hpp +0 -94
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Copyright (c) 2011 Helge Bahmann
7
7
  * Copyright (c) 2013 Tim Blechmann
8
- * Copyright (c) 2014-2020 Andrey Semashev
8
+ * Copyright (c) 2014-2025 Andrey Semashev
9
9
  */
10
10
  /*!
11
11
  * \file atomic/detail/atomic_impl.hpp
@@ -17,8 +17,12 @@
17
17
  #define BOOST_ATOMIC_DETAIL_ATOMIC_IMPL_HPP_INCLUDED_
18
18
 
19
19
  #include <cstddef>
20
+ #include <chrono>
21
+ #include <utility>
22
+ #include <type_traits>
20
23
  #include <boost/assert.hpp>
21
24
  #include <boost/memory_order.hpp>
25
+ #include <boost/atomic/wait_result.hpp>
22
26
  #include <boost/atomic/detail/config.hpp>
23
27
  #include <boost/atomic/detail/intptr.hpp>
24
28
  #include <boost/atomic/detail/storage_traits.hpp>
@@ -30,11 +34,8 @@
30
34
  #include <boost/atomic/detail/memory_order_utils.hpp>
31
35
  #include <boost/atomic/detail/aligned_variable.hpp>
32
36
  #include <boost/atomic/detail/type_traits/is_signed.hpp>
33
- #include <boost/atomic/detail/type_traits/is_nothrow_default_constructible.hpp>
34
- #include <boost/atomic/detail/type_traits/is_trivially_default_constructible.hpp>
35
37
  #include <boost/atomic/detail/type_traits/alignment_of.hpp>
36
- #include <boost/atomic/detail/type_traits/conditional.hpp>
37
- #include <boost/atomic/detail/type_traits/integral_constant.hpp>
38
+ #include <boost/atomic/detail/type_traits/is_trivially_default_constructible.hpp>
38
39
  #if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
39
40
  #include <boost/atomic/detail/bitwise_fp_cast.hpp>
40
41
  #include <boost/atomic/detail/fp_operations.hpp>
@@ -46,8 +47,8 @@
46
47
  #pragma once
47
48
  #endif
48
49
 
49
- #if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_CONSTEXPR_UNION_INIT) && !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_CONSTEXPR_BITWISE_CAST)
50
- #define BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR BOOST_CONSTEXPR
50
+ #if !defined(BOOST_ATOMIC_DETAIL_NO_CXX11_CONSTEXPR_BITWISE_CAST)
51
+ #define BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR constexpr
51
52
  #else
52
53
  #define BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR
53
54
  #endif
@@ -65,63 +66,65 @@ template< typename T, bool Signed, bool Interprocess >
65
66
  class base_atomic_common
66
67
  {
67
68
  public:
68
- typedef T value_type;
69
+ using value_type = T;
69
70
 
70
71
  protected:
71
- typedef atomics::detail::core_operations< storage_size_of< value_type >::value, Signed, Interprocess > core_operations;
72
- typedef atomics::detail::wait_operations< core_operations > wait_operations;
73
- typedef typename atomics::detail::conditional< sizeof(value_type) <= sizeof(void*), value_type, value_type const& >::type value_arg_type;
74
- typedef typename core_operations::storage_type storage_type;
72
+ using core_operations = atomics::detail::core_operations< storage_size_of< value_type >::value, Signed, Interprocess >;
73
+ using wait_operations = atomics::detail::wait_operations< core_operations >;
74
+ using value_arg_type = typename std::conditional< sizeof(value_type) <= sizeof(void*), value_type, value_type const& >::type;
75
+ using storage_type = typename core_operations::storage_type;
75
76
 
76
77
  protected:
77
- static BOOST_CONSTEXPR_OR_CONST std::size_t storage_alignment = atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment ? core_operations::storage_alignment : atomics::detail::alignment_of< value_type >::value;
78
+ static constexpr std::size_t storage_alignment =
79
+ atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment ?
80
+ core_operations::storage_alignment : atomics::detail::alignment_of< value_type >::value;
78
81
 
79
82
  public:
80
- static BOOST_CONSTEXPR_OR_CONST bool is_always_lock_free = core_operations::is_always_lock_free;
81
- static BOOST_CONSTEXPR_OR_CONST bool always_has_native_wait_notify = wait_operations::always_has_native_wait_notify;
83
+ static constexpr bool is_always_lock_free = core_operations::is_always_lock_free;
84
+ static constexpr bool always_has_native_wait_notify = wait_operations::always_has_native_wait_notify;
82
85
 
83
86
  protected:
84
87
  BOOST_ATOMIC_DETAIL_ALIGNED_VAR_TPL(storage_alignment, storage_type, m_storage);
85
88
 
86
89
  public:
87
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_UNION_INIT base_atomic_common() BOOST_NOEXCEPT : m_storage()
90
+ BOOST_FORCEINLINE constexpr base_atomic_common() noexcept : m_storage()
88
91
  {
89
92
  }
90
93
 
91
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_UNION_INIT explicit base_atomic_common(storage_type v) BOOST_NOEXCEPT : m_storage(v)
94
+ BOOST_FORCEINLINE constexpr explicit base_atomic_common(storage_type v) noexcept : m_storage(v)
92
95
  {
93
96
  }
94
97
 
95
- BOOST_FORCEINLINE value_type& value() BOOST_NOEXCEPT { return *reinterpret_cast< value_type* >(&m_storage); }
96
- BOOST_FORCEINLINE value_type volatile& value() volatile BOOST_NOEXCEPT { return *reinterpret_cast< volatile value_type* >(&m_storage); }
97
- BOOST_FORCEINLINE value_type const& value() const BOOST_NOEXCEPT { return *reinterpret_cast< const value_type* >(&m_storage); }
98
- BOOST_FORCEINLINE value_type const volatile& value() const volatile BOOST_NOEXCEPT { return *reinterpret_cast< const volatile value_type* >(&m_storage); }
98
+ BOOST_FORCEINLINE value_type& value() noexcept { return *reinterpret_cast< value_type* >(&m_storage); }
99
+ BOOST_FORCEINLINE value_type volatile& value() volatile noexcept { return *reinterpret_cast< volatile value_type* >(&m_storage); }
100
+ BOOST_FORCEINLINE value_type const& value() const noexcept { return *reinterpret_cast< const value_type* >(&m_storage); }
101
+ BOOST_FORCEINLINE value_type const volatile& value() const volatile noexcept { return *reinterpret_cast< const volatile value_type* >(&m_storage); }
99
102
 
100
103
  protected:
101
- BOOST_FORCEINLINE storage_type& storage() BOOST_NOEXCEPT { return m_storage; }
102
- BOOST_FORCEINLINE storage_type volatile& storage() volatile BOOST_NOEXCEPT { return m_storage; }
103
- BOOST_FORCEINLINE storage_type const& storage() const BOOST_NOEXCEPT { return m_storage; }
104
- BOOST_FORCEINLINE storage_type const volatile& storage() const volatile BOOST_NOEXCEPT { return m_storage; }
104
+ BOOST_FORCEINLINE storage_type& storage() noexcept { return m_storage; }
105
+ BOOST_FORCEINLINE storage_type volatile& storage() volatile noexcept { return m_storage; }
106
+ BOOST_FORCEINLINE storage_type const& storage() const noexcept { return m_storage; }
107
+ BOOST_FORCEINLINE storage_type const volatile& storage() const volatile noexcept { return m_storage; }
105
108
 
106
109
  public:
107
- BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
110
+ BOOST_FORCEINLINE bool is_lock_free() const volatile noexcept
108
111
  {
109
112
  // C++17 requires all instances of atomic<> return a value consistent with is_always_lock_free here.
110
113
  // Boost.Atomic also enforces the required alignment of the atomic storage, so we can always return is_always_lock_free.
111
114
  return is_always_lock_free;
112
115
  }
113
116
 
114
- BOOST_FORCEINLINE bool has_native_wait_notify() const volatile BOOST_NOEXCEPT
117
+ BOOST_FORCEINLINE bool has_native_wait_notify() const volatile noexcept
115
118
  {
116
119
  return wait_operations::has_native_wait_notify(this->storage());
117
120
  }
118
121
 
119
- BOOST_FORCEINLINE void notify_one() volatile BOOST_NOEXCEPT
122
+ BOOST_FORCEINLINE void notify_one() volatile noexcept
120
123
  {
121
124
  wait_operations::notify_one(this->storage());
122
125
  }
123
126
 
124
- BOOST_FORCEINLINE void notify_all() volatile BOOST_NOEXCEPT
127
+ BOOST_FORCEINLINE void notify_all() volatile noexcept
125
128
  {
126
129
  wait_operations::notify_all(this->storage());
127
130
  }
@@ -129,9 +132,9 @@ public:
129
132
 
130
133
  #if defined(BOOST_NO_CXX17_INLINE_VARIABLES)
131
134
  template< typename T, bool Signed, bool Interprocess >
132
- BOOST_CONSTEXPR_OR_CONST bool base_atomic_common< T, Signed, Interprocess >::is_always_lock_free;
135
+ constexpr bool base_atomic_common< T, Signed, Interprocess >::is_always_lock_free;
133
136
  template< typename T, bool Signed, bool Interprocess >
134
- BOOST_CONSTEXPR_OR_CONST bool base_atomic_common< T, Signed, Interprocess >::always_has_native_wait_notify;
137
+ constexpr bool base_atomic_common< T, Signed, Interprocess >::always_has_native_wait_notify;
135
138
  #endif
136
139
 
137
140
 
@@ -143,15 +146,15 @@ class base_atomic_generic< T, Interprocess, true > :
143
146
  public base_atomic_common< T, false, Interprocess >
144
147
  {
145
148
  private:
146
- typedef base_atomic_common< T, false, Interprocess > base_type;
149
+ using base_type = base_atomic_common< T, false, Interprocess >;
147
150
 
148
151
  protected:
149
- typedef typename base_type::storage_type storage_type;
150
- typedef typename base_type::value_arg_type value_arg_type;
152
+ using storage_type = typename base_type::storage_type;
153
+ using value_arg_type = typename base_type::value_arg_type;
151
154
 
152
155
  public:
153
- BOOST_DEFAULTED_FUNCTION(base_atomic_generic() BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_DECL, BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_IMPL {})
154
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v) BOOST_NOEXCEPT :
156
+ base_atomic_generic() = default;
157
+ BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v) noexcept :
155
158
  base_type(atomics::detail::bitwise_cast< storage_type >(v))
156
159
  {
157
160
  }
@@ -162,17 +165,17 @@ class base_atomic_generic< T, Interprocess, false > :
162
165
  public base_atomic_common< T, false, Interprocess >
163
166
  {
164
167
  private:
165
- typedef base_atomic_common< T, false, Interprocess > base_type;
168
+ using base_type = base_atomic_common< T, false, Interprocess >;
166
169
 
167
170
  public:
168
- typedef typename base_type::value_type value_type;
171
+ using value_type = typename base_type::value_type;
169
172
 
170
173
  protected:
171
- typedef typename base_type::storage_type storage_type;
172
- typedef typename base_type::value_arg_type value_arg_type;
174
+ using storage_type = typename base_type::storage_type;
175
+ using value_arg_type = typename base_type::value_arg_type;
173
176
 
174
177
  public:
175
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v = value_type()) BOOST_NOEXCEPT :
178
+ BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic_generic(value_arg_type v = value_type()) noexcept :
176
179
  base_type(atomics::detail::bitwise_cast< storage_type >(v))
177
180
  {
178
181
  }
@@ -188,34 +191,41 @@ class base_atomic< T, void, Interprocess > :
188
191
  public base_atomic_generic< T, Interprocess >
189
192
  {
190
193
  private:
191
- typedef base_atomic_generic< T, Interprocess > base_type;
194
+ using base_type = base_atomic_generic< T, Interprocess >;
192
195
 
193
196
  public:
194
- typedef typename base_type::value_type value_type;
197
+ using value_type = typename base_type::value_type;
195
198
 
196
199
  protected:
197
- typedef typename base_type::core_operations core_operations;
198
- typedef typename base_type::wait_operations wait_operations;
199
- typedef typename base_type::storage_type storage_type;
200
- typedef typename base_type::value_arg_type value_arg_type;
200
+ using core_operations = typename base_type::core_operations;
201
+ using wait_operations = typename base_type::wait_operations;
202
+ using storage_type = typename base_type::storage_type;
203
+ using value_arg_type = typename base_type::value_arg_type;
201
204
 
202
205
  private:
206
+ using cxchg_use_bitwise_cast =
203
207
  #if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
204
- typedef atomics::detail::true_type cxchg_use_bitwise_cast;
208
+ std::true_type;
205
209
  #else
206
- typedef atomics::detail::integral_constant< bool, sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment > cxchg_use_bitwise_cast;
210
+ std::integral_constant<
211
+ bool,
212
+ sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
213
+ >;
207
214
  #endif
208
215
 
209
216
  public:
210
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR base_atomic() BOOST_NOEXCEPT_IF(atomics::detail::is_nothrow_default_constructible< value_type >::value) : base_type()
217
+ BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR base_atomic() noexcept(std::is_nothrow_default_constructible< value_type >::value) : base_type()
211
218
  {
212
219
  }
213
220
 
214
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(v)
221
+ BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) noexcept : base_type(v)
215
222
  {
216
223
  }
217
224
 
218
- BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
225
+ base_atomic(base_atomic const&) = delete;
226
+ base_atomic& operator=(base_atomic const&) = delete;
227
+
228
+ BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
219
229
  {
220
230
  BOOST_ASSERT(order != memory_order_consume);
221
231
  BOOST_ASSERT(order != memory_order_acquire);
@@ -224,7 +234,7 @@ public:
224
234
  core_operations::store(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order);
225
235
  }
226
236
 
227
- BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
237
+ BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
228
238
  {
229
239
  BOOST_ASSERT(order != memory_order_release);
230
240
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -232,12 +242,12 @@ public:
232
242
  return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
233
243
  }
234
244
 
235
- BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
245
+ BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
236
246
  {
237
247
  return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< storage_type >(v), order));
238
248
  }
239
249
 
240
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
250
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
241
251
  {
242
252
  BOOST_ASSERT(failure_order != memory_order_release);
243
253
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -246,12 +256,12 @@ public:
246
256
  return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
247
257
  }
248
258
 
249
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
259
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
250
260
  {
251
261
  return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
252
262
  }
253
263
 
254
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
264
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
255
265
  {
256
266
  BOOST_ASSERT(failure_order != memory_order_release);
257
267
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -260,12 +270,12 @@ public:
260
270
  return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
261
271
  }
262
272
 
263
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
273
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
264
274
  {
265
275
  return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
266
276
  }
267
277
 
268
- BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
278
+ BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
269
279
  {
270
280
  BOOST_ASSERT(order != memory_order_release);
271
281
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -273,32 +283,65 @@ public:
273
283
  return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), order));
274
284
  }
275
285
 
276
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
277
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
286
+ template< typename Clock, typename Duration >
287
+ BOOST_FORCEINLINE wait_result< value_type >
288
+ wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
289
+ noexcept(noexcept(wait_operations::wait_until(
290
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
291
+ {
292
+ BOOST_ASSERT(order != memory_order_release);
293
+ BOOST_ASSERT(order != memory_order_acq_rel);
294
+
295
+ bool timed_out = false;
296
+ storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
297
+ return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
298
+ }
299
+
300
+ template< typename Rep, typename Period >
301
+ BOOST_FORCEINLINE wait_result< value_type >
302
+ wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
303
+ noexcept(noexcept(wait_operations::wait_for(
304
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
305
+ {
306
+ BOOST_ASSERT(order != memory_order_release);
307
+ BOOST_ASSERT(order != memory_order_acq_rel);
308
+
309
+ bool timed_out = false;
310
+ storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_cast< storage_type >(old_val), timeout, order, timed_out);
311
+ return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
312
+ }
278
313
 
279
314
  private:
280
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
315
+ BOOST_FORCEINLINE bool
316
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
281
317
  {
282
- return core_operations::compare_exchange_strong(this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
318
+ return core_operations::compare_exchange_strong(
319
+ this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
283
320
  }
284
321
 
285
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
322
+ BOOST_FORCEINLINE bool
323
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
286
324
  {
287
325
  storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
288
- const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
326
+ const bool res = core_operations::compare_exchange_strong(
327
+ this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
289
328
  expected = atomics::detail::bitwise_cast< value_type >(old_value);
290
329
  return res;
291
330
  }
292
331
 
293
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
332
+ BOOST_FORCEINLINE bool
333
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
294
334
  {
295
- return core_operations::compare_exchange_weak(this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
335
+ return core_operations::compare_exchange_weak(
336
+ this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
296
337
  }
297
338
 
298
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
339
+ BOOST_FORCEINLINE bool
340
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
299
341
  {
300
342
  storage_type old_value = atomics::detail::bitwise_cast< storage_type >(expected);
301
- const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
343
+ const bool res = core_operations::compare_exchange_weak(
344
+ this->storage(), old_value, atomics::detail::bitwise_cast< storage_type >(desired), success_order, failure_order);
302
345
  expected = atomics::detail::bitwise_cast< value_type >(old_value);
303
346
  return res;
304
347
  }
@@ -311,31 +354,39 @@ class base_atomic< T, const int, Interprocess > :
311
354
  public base_atomic_common< T, false, Interprocess >
312
355
  {
313
356
  private:
314
- typedef base_atomic_common< T, false, Interprocess > base_type;
357
+ using base_type = base_atomic_common< T, false, Interprocess >;
315
358
 
316
359
  public:
317
- typedef typename base_type::value_type value_type;
360
+ using value_type = typename base_type::value_type;
318
361
 
319
362
  protected:
320
- typedef typename base_type::core_operations core_operations;
321
- typedef typename base_type::wait_operations wait_operations;
322
- typedef typename base_type::storage_type storage_type;
323
- typedef typename base_type::value_arg_type value_arg_type;
363
+ using core_operations = typename base_type::core_operations;
364
+ using wait_operations = typename base_type::wait_operations;
365
+ using extra_operations = atomics::detail::extra_operations< core_operations >;
366
+ using storage_type = typename base_type::storage_type;
367
+ using value_arg_type = typename base_type::value_arg_type;
324
368
 
325
369
  private:
370
+ using cxchg_use_bitwise_cast =
326
371
  #if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
327
- typedef atomics::detail::true_type cxchg_use_bitwise_cast;
372
+ std::true_type;
328
373
  #else
329
- typedef atomics::detail::integral_constant< bool, sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment > cxchg_use_bitwise_cast;
374
+ std::integral_constant<
375
+ bool,
376
+ sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
377
+ >;
330
378
  #endif
331
379
 
332
380
  public:
333
- BOOST_DEFAULTED_FUNCTION(base_atomic() BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_DECL, BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_IMPL {})
334
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_UNION_INIT explicit base_atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(static_cast< storage_type >(v))
381
+ base_atomic() = default;
382
+ BOOST_FORCEINLINE constexpr explicit base_atomic(value_arg_type v) noexcept : base_type(static_cast< storage_type >(v))
335
383
  {
336
384
  }
337
385
 
338
- BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
386
+ base_atomic(base_atomic const&) = delete;
387
+ base_atomic& operator=(base_atomic const&) = delete;
388
+
389
+ BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
339
390
  {
340
391
  BOOST_ASSERT(order != memory_order_consume);
341
392
  BOOST_ASSERT(order != memory_order_acquire);
@@ -344,7 +395,7 @@ public:
344
395
  core_operations::store(this->storage(), static_cast< storage_type >(v), order);
345
396
  }
346
397
 
347
- BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
398
+ BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
348
399
  {
349
400
  BOOST_ASSERT(order != memory_order_release);
350
401
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -352,12 +403,12 @@ public:
352
403
  return atomics::detail::bitwise_cast< value_type >(core_operations::load(this->storage(), order));
353
404
  }
354
405
 
355
- BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
406
+ BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
356
407
  {
357
408
  return atomics::detail::bitwise_cast< value_type >(core_operations::exchange(this->storage(), static_cast< storage_type >(v), order));
358
409
  }
359
410
 
360
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
411
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
361
412
  {
362
413
  BOOST_ASSERT(failure_order != memory_order_release);
363
414
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -366,12 +417,12 @@ public:
366
417
  return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
367
418
  }
368
419
 
369
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
420
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
370
421
  {
371
422
  return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
372
423
  }
373
424
 
374
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
425
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
375
426
  {
376
427
  BOOST_ASSERT(failure_order != memory_order_release);
377
428
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -380,12 +431,125 @@ public:
380
431
  return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
381
432
  }
382
433
 
383
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
434
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
384
435
  {
385
436
  return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
386
437
  }
387
438
 
388
- BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
439
+ BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
440
+ {
441
+ return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_and(this->storage(), static_cast< storage_type >(v), order));
442
+ }
443
+
444
+ BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
445
+ {
446
+ return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_or(this->storage(), static_cast< storage_type >(v), order));
447
+ }
448
+
449
+ BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
450
+ {
451
+ return atomics::detail::bitwise_cast< value_type >(core_operations::fetch_xor(this->storage(), static_cast< storage_type >(v), order));
452
+ }
453
+
454
+ BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) volatile noexcept
455
+ {
456
+ return atomics::detail::bitwise_cast< value_type >(extra_operations::fetch_complement(this->storage(), order));
457
+ }
458
+
459
+ BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
460
+ {
461
+ return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_and(this->storage(), static_cast< storage_type >(v), order));
462
+ }
463
+
464
+ BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
465
+ {
466
+ return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_or(this->storage(), static_cast< storage_type >(v), order));
467
+ }
468
+
469
+ BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
470
+ {
471
+ return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_xor(this->storage(), static_cast< storage_type >(v), order));
472
+ }
473
+
474
+ BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) volatile noexcept
475
+ {
476
+ return atomics::detail::bitwise_cast< value_type >(extra_operations::bitwise_complement(this->storage(), order));
477
+ }
478
+
479
+ BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
480
+ {
481
+ extra_operations::opaque_and(this->storage(), static_cast< storage_type >(v), order);
482
+ }
483
+
484
+ BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
485
+ {
486
+ extra_operations::opaque_or(this->storage(), static_cast< storage_type >(v), order);
487
+ }
488
+
489
+ BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
490
+ {
491
+ extra_operations::opaque_xor(this->storage(), static_cast< storage_type >(v), order);
492
+ }
493
+
494
+ BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) volatile noexcept
495
+ {
496
+ extra_operations::opaque_complement(this->storage(), order);
497
+ }
498
+
499
+ BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
500
+ {
501
+ return extra_operations::and_and_test(this->storage(), static_cast< storage_type >(v), order);
502
+ }
503
+
504
+ BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
505
+ {
506
+ return extra_operations::or_and_test(this->storage(), static_cast< storage_type >(v), order);
507
+ }
508
+
509
+ BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
510
+ {
511
+ return extra_operations::xor_and_test(this->storage(), static_cast< storage_type >(v), order);
512
+ }
513
+
514
+ BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) volatile noexcept
515
+ {
516
+ return extra_operations::complement_and_test(this->storage(), order);
517
+ }
518
+
519
+ BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
520
+ {
521
+ BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
522
+ return extra_operations::bit_test_and_set(this->storage(), bit_number, order);
523
+ }
524
+
525
+ BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
526
+ {
527
+ BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
528
+ return extra_operations::bit_test_and_reset(this->storage(), bit_number, order);
529
+ }
530
+
531
+ BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
532
+ {
533
+ BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
534
+ return extra_operations::bit_test_and_complement(this->storage(), bit_number, order);
535
+ }
536
+
537
+ BOOST_FORCEINLINE value_type operator&=(value_type v) volatile noexcept
538
+ {
539
+ return bitwise_and(v);
540
+ }
541
+
542
+ BOOST_FORCEINLINE value_type operator|=(value_type v) volatile noexcept
543
+ {
544
+ return bitwise_or(v);
545
+ }
546
+
547
+ BOOST_FORCEINLINE value_type operator^=(value_type v) volatile noexcept
548
+ {
549
+ return bitwise_xor(v);
550
+ }
551
+
552
+ BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
389
553
  {
390
554
  BOOST_ASSERT(order != memory_order_release);
391
555
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -393,16 +557,44 @@ public:
393
557
  return atomics::detail::bitwise_cast< value_type >(wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order));
394
558
  }
395
559
 
396
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
397
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
560
+ template< typename Clock, typename Duration >
561
+ BOOST_FORCEINLINE wait_result< value_type >
562
+ wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
563
+ noexcept(noexcept(wait_operations::wait_until(
564
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
565
+ {
566
+ BOOST_ASSERT(order != memory_order_release);
567
+ BOOST_ASSERT(order != memory_order_acq_rel);
568
+
569
+ bool timed_out = false;
570
+ storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
571
+ return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
572
+ }
573
+
574
+ template< typename Rep, typename Period >
575
+ BOOST_FORCEINLINE wait_result< value_type >
576
+ wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
577
+ noexcept(noexcept(wait_operations::wait_for(
578
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
579
+ {
580
+ BOOST_ASSERT(order != memory_order_release);
581
+ BOOST_ASSERT(order != memory_order_acq_rel);
582
+
583
+ bool timed_out = false;
584
+ storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
585
+ return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
586
+ }
398
587
 
399
588
  private:
400
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
589
+ BOOST_FORCEINLINE bool
590
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
401
591
  {
402
- return core_operations::compare_exchange_strong(this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
592
+ return core_operations::compare_exchange_strong(
593
+ this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
403
594
  }
404
595
 
405
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
596
+ BOOST_FORCEINLINE bool
597
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
406
598
  {
407
599
  storage_type old_value = static_cast< storage_type >(expected);
408
600
  const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
@@ -410,12 +602,15 @@ private:
410
602
  return res;
411
603
  }
412
604
 
413
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
605
+ BOOST_FORCEINLINE bool
606
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
414
607
  {
415
- return core_operations::compare_exchange_weak(this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
608
+ return core_operations::compare_exchange_weak(
609
+ this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
416
610
  }
417
611
 
418
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
612
+ BOOST_FORCEINLINE bool
613
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
419
614
  {
420
615
  storage_type old_value = static_cast< storage_type >(expected);
421
616
  const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
@@ -431,32 +626,39 @@ class base_atomic< T, int, Interprocess > :
431
626
  public base_atomic_common< T, atomics::detail::is_signed< T >::value, Interprocess >
432
627
  {
433
628
  private:
434
- typedef base_atomic_common< T, atomics::detail::is_signed< T >::value, Interprocess > base_type;
629
+ using base_type = base_atomic_common< T, atomics::detail::is_signed< T >::value, Interprocess >;
435
630
 
436
631
  public:
437
- typedef typename base_type::value_type value_type;
438
- typedef value_type difference_type;
632
+ using value_type = typename base_type::value_type;
633
+ using difference_type = value_type;
439
634
 
440
635
  protected:
441
- typedef typename base_type::core_operations core_operations;
442
- typedef typename base_type::wait_operations wait_operations;
443
- typedef atomics::detail::extra_operations< core_operations > extra_operations;
444
- typedef typename base_type::storage_type storage_type;
445
- typedef value_type value_arg_type;
636
+ using core_operations = typename base_type::core_operations;
637
+ using wait_operations = typename base_type::wait_operations;
638
+ using extra_operations = atomics::detail::extra_operations< core_operations >;
639
+ using storage_type = typename base_type::storage_type;
640
+ using value_arg_type = value_type;
446
641
 
447
642
  private:
643
+ using cxchg_use_bitwise_cast =
448
644
  #if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
449
- typedef atomics::detail::true_type cxchg_use_bitwise_cast;
645
+ std::true_type;
450
646
  #else
451
- typedef atomics::detail::integral_constant< bool, sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment > cxchg_use_bitwise_cast;
647
+ std::integral_constant<
648
+ bool,
649
+ sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
650
+ >;
452
651
  #endif
453
652
 
454
653
  public:
455
- BOOST_DEFAULTED_FUNCTION(base_atomic() BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_DECL, BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_IMPL {})
456
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_UNION_INIT explicit base_atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(static_cast< storage_type >(v)) {}
654
+ base_atomic() = default;
655
+ BOOST_FORCEINLINE constexpr explicit base_atomic(value_arg_type v) noexcept : base_type(static_cast< storage_type >(v)) {}
656
+
657
+ base_atomic(base_atomic const&) = delete;
658
+ base_atomic& operator=(base_atomic const&) = delete;
457
659
 
458
660
  // Standard methods
459
- BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
661
+ BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
460
662
  {
461
663
  BOOST_ASSERT(order != memory_order_consume);
462
664
  BOOST_ASSERT(order != memory_order_acquire);
@@ -465,7 +667,7 @@ public:
465
667
  core_operations::store(this->storage(), static_cast< storage_type >(v), order);
466
668
  }
467
669
 
468
- BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
670
+ BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
469
671
  {
470
672
  BOOST_ASSERT(order != memory_order_release);
471
673
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -473,22 +675,22 @@ public:
473
675
  return atomics::detail::integral_truncate< value_type >(core_operations::load(this->storage(), order));
474
676
  }
475
677
 
476
- BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
678
+ BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
477
679
  {
478
680
  return atomics::detail::integral_truncate< value_type >(core_operations::fetch_add(this->storage(), static_cast< storage_type >(v), order));
479
681
  }
480
682
 
481
- BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
683
+ BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
482
684
  {
483
685
  return atomics::detail::integral_truncate< value_type >(core_operations::fetch_sub(this->storage(), static_cast< storage_type >(v), order));
484
686
  }
485
687
 
486
- BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
688
+ BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
487
689
  {
488
690
  return atomics::detail::integral_truncate< value_type >(core_operations::exchange(this->storage(), static_cast< storage_type >(v), order));
489
691
  }
490
692
 
491
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
693
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
492
694
  {
493
695
  BOOST_ASSERT(failure_order != memory_order_release);
494
696
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -497,12 +699,12 @@ public:
497
699
  return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
498
700
  }
499
701
 
500
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
702
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
501
703
  {
502
704
  return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
503
705
  }
504
706
 
505
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
707
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
506
708
  {
507
709
  BOOST_ASSERT(failure_order != memory_order_release);
508
710
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -511,207 +713,207 @@ public:
511
713
  return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
512
714
  }
513
715
 
514
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
716
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
515
717
  {
516
718
  return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
517
719
  }
518
720
 
519
- BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
721
+ BOOST_FORCEINLINE value_type fetch_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
520
722
  {
521
723
  return atomics::detail::integral_truncate< value_type >(core_operations::fetch_and(this->storage(), static_cast< storage_type >(v), order));
522
724
  }
523
725
 
524
- BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
726
+ BOOST_FORCEINLINE value_type fetch_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
525
727
  {
526
728
  return atomics::detail::integral_truncate< value_type >(core_operations::fetch_or(this->storage(), static_cast< storage_type >(v), order));
527
729
  }
528
730
 
529
- BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
731
+ BOOST_FORCEINLINE value_type fetch_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
530
732
  {
531
733
  return atomics::detail::integral_truncate< value_type >(core_operations::fetch_xor(this->storage(), static_cast< storage_type >(v), order));
532
734
  }
533
735
 
534
736
  // Boost.Atomic extensions
535
- BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
737
+ BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile noexcept
536
738
  {
537
739
  return atomics::detail::integral_truncate< value_type >(extra_operations::fetch_negate(this->storage(), order));
538
740
  }
539
741
 
540
- BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
742
+ BOOST_FORCEINLINE value_type fetch_complement(memory_order order = memory_order_seq_cst) volatile noexcept
541
743
  {
542
744
  return atomics::detail::integral_truncate< value_type >(extra_operations::fetch_complement(this->storage(), order));
543
745
  }
544
746
 
545
- BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
747
+ BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
546
748
  {
547
749
  return atomics::detail::integral_truncate< value_type >(extra_operations::add(this->storage(), static_cast< storage_type >(v), order));
548
750
  }
549
751
 
550
- BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
752
+ BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
551
753
  {
552
754
  return atomics::detail::integral_truncate< value_type >(extra_operations::sub(this->storage(), static_cast< storage_type >(v), order));
553
755
  }
554
756
 
555
- BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
757
+ BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile noexcept
556
758
  {
557
759
  return atomics::detail::integral_truncate< value_type >(extra_operations::negate(this->storage(), order));
558
760
  }
559
761
 
560
- BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
762
+ BOOST_FORCEINLINE value_type bitwise_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
561
763
  {
562
764
  return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_and(this->storage(), static_cast< storage_type >(v), order));
563
765
  }
564
766
 
565
- BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
767
+ BOOST_FORCEINLINE value_type bitwise_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
566
768
  {
567
769
  return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_or(this->storage(), static_cast< storage_type >(v), order));
568
770
  }
569
771
 
570
- BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
772
+ BOOST_FORCEINLINE value_type bitwise_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
571
773
  {
572
774
  return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_xor(this->storage(), static_cast< storage_type >(v), order));
573
775
  }
574
776
 
575
- BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
777
+ BOOST_FORCEINLINE value_type bitwise_complement(memory_order order = memory_order_seq_cst) volatile noexcept
576
778
  {
577
779
  return atomics::detail::integral_truncate< value_type >(extra_operations::bitwise_complement(this->storage(), order));
578
780
  }
579
781
 
580
- BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
782
+ BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
581
783
  {
582
784
  extra_operations::opaque_add(this->storage(), static_cast< storage_type >(v), order);
583
785
  }
584
786
 
585
- BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
787
+ BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
586
788
  {
587
789
  extra_operations::opaque_sub(this->storage(), static_cast< storage_type >(v), order);
588
790
  }
589
791
 
590
- BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
792
+ BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile noexcept
591
793
  {
592
794
  extra_operations::opaque_negate(this->storage(), order);
593
795
  }
594
796
 
595
- BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
797
+ BOOST_FORCEINLINE void opaque_and(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
596
798
  {
597
799
  extra_operations::opaque_and(this->storage(), static_cast< storage_type >(v), order);
598
800
  }
599
801
 
600
- BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
802
+ BOOST_FORCEINLINE void opaque_or(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
601
803
  {
602
804
  extra_operations::opaque_or(this->storage(), static_cast< storage_type >(v), order);
603
805
  }
604
806
 
605
- BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
807
+ BOOST_FORCEINLINE void opaque_xor(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
606
808
  {
607
809
  extra_operations::opaque_xor(this->storage(), static_cast< storage_type >(v), order);
608
810
  }
609
811
 
610
- BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
812
+ BOOST_FORCEINLINE void opaque_complement(memory_order order = memory_order_seq_cst) volatile noexcept
611
813
  {
612
814
  extra_operations::opaque_complement(this->storage(), order);
613
815
  }
614
816
 
615
- BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
817
+ BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
616
818
  {
617
819
  return extra_operations::add_and_test(this->storage(), static_cast< storage_type >(v), order);
618
820
  }
619
821
 
620
- BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
822
+ BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
621
823
  {
622
824
  return extra_operations::sub_and_test(this->storage(), static_cast< storage_type >(v), order);
623
825
  }
624
826
 
625
- BOOST_FORCEINLINE bool negate_and_test(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
827
+ BOOST_FORCEINLINE bool negate_and_test(memory_order order = memory_order_seq_cst) volatile noexcept
626
828
  {
627
829
  return extra_operations::negate_and_test(this->storage(), order);
628
830
  }
629
831
 
630
- BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
832
+ BOOST_FORCEINLINE bool and_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
631
833
  {
632
834
  return extra_operations::and_and_test(this->storage(), static_cast< storage_type >(v), order);
633
835
  }
634
836
 
635
- BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
837
+ BOOST_FORCEINLINE bool or_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
636
838
  {
637
839
  return extra_operations::or_and_test(this->storage(), static_cast< storage_type >(v), order);
638
840
  }
639
841
 
640
- BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
842
+ BOOST_FORCEINLINE bool xor_and_test(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
641
843
  {
642
844
  return extra_operations::xor_and_test(this->storage(), static_cast< storage_type >(v), order);
643
845
  }
644
846
 
645
- BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
847
+ BOOST_FORCEINLINE bool complement_and_test(memory_order order = memory_order_seq_cst) volatile noexcept
646
848
  {
647
849
  return extra_operations::complement_and_test(this->storage(), order);
648
850
  }
649
851
 
650
- BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
852
+ BOOST_FORCEINLINE bool bit_test_and_set(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
651
853
  {
652
854
  BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
653
855
  return extra_operations::bit_test_and_set(this->storage(), bit_number, order);
654
856
  }
655
857
 
656
- BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
858
+ BOOST_FORCEINLINE bool bit_test_and_reset(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
657
859
  {
658
860
  BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
659
861
  return extra_operations::bit_test_and_reset(this->storage(), bit_number, order);
660
862
  }
661
863
 
662
- BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
864
+ BOOST_FORCEINLINE bool bit_test_and_complement(unsigned int bit_number, memory_order order = memory_order_seq_cst) volatile noexcept
663
865
  {
664
866
  BOOST_ASSERT(bit_number < sizeof(value_type) * 8u);
665
867
  return extra_operations::bit_test_and_complement(this->storage(), bit_number, order);
666
868
  }
667
869
 
668
870
  // Operators
669
- BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
871
+ BOOST_FORCEINLINE value_type operator++(int) volatile noexcept
670
872
  {
671
873
  return fetch_add(1);
672
874
  }
673
875
 
674
- BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
876
+ BOOST_FORCEINLINE value_type operator++() volatile noexcept
675
877
  {
676
878
  return add(1);
677
879
  }
678
880
 
679
- BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
881
+ BOOST_FORCEINLINE value_type operator--(int) volatile noexcept
680
882
  {
681
883
  return fetch_sub(1);
682
884
  }
683
885
 
684
- BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
886
+ BOOST_FORCEINLINE value_type operator--() volatile noexcept
685
887
  {
686
888
  return sub(1);
687
889
  }
688
890
 
689
- BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
891
+ BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile noexcept
690
892
  {
691
893
  return add(v);
692
894
  }
693
895
 
694
- BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
896
+ BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile noexcept
695
897
  {
696
898
  return sub(v);
697
899
  }
698
900
 
699
- BOOST_FORCEINLINE value_type operator&=(value_type v) volatile BOOST_NOEXCEPT
901
+ BOOST_FORCEINLINE value_type operator&=(value_type v) volatile noexcept
700
902
  {
701
903
  return bitwise_and(v);
702
904
  }
703
905
 
704
- BOOST_FORCEINLINE value_type operator|=(value_type v) volatile BOOST_NOEXCEPT
906
+ BOOST_FORCEINLINE value_type operator|=(value_type v) volatile noexcept
705
907
  {
706
908
  return bitwise_or(v);
707
909
  }
708
910
 
709
- BOOST_FORCEINLINE value_type operator^=(value_type v) volatile BOOST_NOEXCEPT
911
+ BOOST_FORCEINLINE value_type operator^=(value_type v) volatile noexcept
710
912
  {
711
913
  return bitwise_xor(v);
712
914
  }
713
915
 
714
- BOOST_FORCEINLINE value_type wait(value_type old_val, memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
916
+ BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
715
917
  {
716
918
  BOOST_ASSERT(order != memory_order_release);
717
919
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -719,16 +921,44 @@ public:
719
921
  return atomics::detail::integral_truncate< value_type >(wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order));
720
922
  }
721
923
 
722
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
723
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
924
+ template< typename Clock, typename Duration >
925
+ BOOST_FORCEINLINE wait_result< value_type >
926
+ wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
927
+ noexcept(noexcept(wait_operations::wait_until(
928
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
929
+ {
930
+ BOOST_ASSERT(order != memory_order_release);
931
+ BOOST_ASSERT(order != memory_order_acq_rel);
932
+
933
+ bool timed_out = false;
934
+ storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
935
+ return wait_result< value_type >(atomics::detail::integral_truncate< value_type >(new_value), timed_out);
936
+ }
937
+
938
+ template< typename Rep, typename Period >
939
+ BOOST_FORCEINLINE wait_result< value_type >
940
+ wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
941
+ noexcept(noexcept(wait_operations::wait_for(
942
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
943
+ {
944
+ BOOST_ASSERT(order != memory_order_release);
945
+ BOOST_ASSERT(order != memory_order_acq_rel);
946
+
947
+ bool timed_out = false;
948
+ storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
949
+ return wait_result< value_type >(atomics::detail::integral_truncate< value_type >(new_value), timed_out);
950
+ }
724
951
 
725
952
  private:
726
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
953
+ BOOST_FORCEINLINE bool
954
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
727
955
  {
728
- return core_operations::compare_exchange_strong(this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
956
+ return core_operations::compare_exchange_strong(
957
+ this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
729
958
  }
730
959
 
731
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
960
+ BOOST_FORCEINLINE bool
961
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
732
962
  {
733
963
  storage_type old_value = static_cast< storage_type >(expected);
734
964
  const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
@@ -736,12 +966,15 @@ private:
736
966
  return res;
737
967
  }
738
968
 
739
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
969
+ BOOST_FORCEINLINE bool
970
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
740
971
  {
741
- return core_operations::compare_exchange_weak(this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
972
+ return core_operations::compare_exchange_weak(
973
+ this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
742
974
  }
743
975
 
744
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
976
+ BOOST_FORCEINLINE bool
977
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
745
978
  {
746
979
  storage_type old_value = static_cast< storage_type >(expected);
747
980
  const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
@@ -756,30 +989,37 @@ class base_atomic< bool, int, Interprocess > :
756
989
  public base_atomic_common< bool, false, Interprocess >
757
990
  {
758
991
  private:
759
- typedef base_atomic_common< bool, false, Interprocess > base_type;
992
+ using base_type = base_atomic_common< bool, false, Interprocess >;
760
993
 
761
994
  public:
762
- typedef typename base_type::value_type value_type;
995
+ using value_type = typename base_type::value_type;
763
996
 
764
997
  protected:
765
- typedef typename base_type::core_operations core_operations;
766
- typedef typename base_type::wait_operations wait_operations;
767
- typedef typename base_type::storage_type storage_type;
768
- typedef value_type value_arg_type;
998
+ using core_operations = typename base_type::core_operations;
999
+ using wait_operations = typename base_type::wait_operations;
1000
+ using storage_type = typename base_type::storage_type;
1001
+ using value_arg_type = value_type;
769
1002
 
770
1003
  private:
1004
+ using cxchg_use_bitwise_cast =
771
1005
  #if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
772
- typedef atomics::detail::true_type cxchg_use_bitwise_cast;
1006
+ std::true_type;
773
1007
  #else
774
- typedef atomics::detail::integral_constant< bool, sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment > cxchg_use_bitwise_cast;
1008
+ std::integral_constant<
1009
+ bool,
1010
+ sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
1011
+ >;
775
1012
  #endif
776
1013
 
777
1014
  public:
778
- BOOST_DEFAULTED_FUNCTION(base_atomic() BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_DECL, BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_IMPL {})
779
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_UNION_INIT explicit base_atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(static_cast< storage_type >(v)) {}
1015
+ base_atomic() = default;
1016
+ BOOST_FORCEINLINE constexpr explicit base_atomic(value_arg_type v) noexcept : base_type(static_cast< storage_type >(v)) {}
1017
+
1018
+ base_atomic(base_atomic const&) = delete;
1019
+ base_atomic& operator=(base_atomic const&) = delete;
780
1020
 
781
1021
  // Standard methods
782
- BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1022
+ BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
783
1023
  {
784
1024
  BOOST_ASSERT(order != memory_order_consume);
785
1025
  BOOST_ASSERT(order != memory_order_acquire);
@@ -788,7 +1028,7 @@ public:
788
1028
  core_operations::store(this->storage(), static_cast< storage_type >(v), order);
789
1029
  }
790
1030
 
791
- BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
1031
+ BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
792
1032
  {
793
1033
  BOOST_ASSERT(order != memory_order_release);
794
1034
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -796,12 +1036,12 @@ public:
796
1036
  return !!core_operations::load(this->storage(), order);
797
1037
  }
798
1038
 
799
- BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1039
+ BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
800
1040
  {
801
1041
  return !!core_operations::exchange(this->storage(), static_cast< storage_type >(v), order);
802
1042
  }
803
1043
 
804
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
1044
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
805
1045
  {
806
1046
  BOOST_ASSERT(failure_order != memory_order_release);
807
1047
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -810,12 +1050,12 @@ public:
810
1050
  return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
811
1051
  }
812
1052
 
813
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1053
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
814
1054
  {
815
1055
  return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
816
1056
  }
817
1057
 
818
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
1058
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
819
1059
  {
820
1060
  BOOST_ASSERT(failure_order != memory_order_release);
821
1061
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -824,12 +1064,12 @@ public:
824
1064
  return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
825
1065
  }
826
1066
 
827
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1067
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
828
1068
  {
829
1069
  return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
830
1070
  }
831
1071
 
832
- BOOST_FORCEINLINE value_type wait(value_type old_val, memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
1072
+ BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
833
1073
  {
834
1074
  BOOST_ASSERT(order != memory_order_release);
835
1075
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -837,16 +1077,44 @@ public:
837
1077
  return !!wait_operations::wait(this->storage(), static_cast< storage_type >(old_val), order);
838
1078
  }
839
1079
 
840
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
841
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
1080
+ template< typename Clock, typename Duration >
1081
+ BOOST_FORCEINLINE wait_result< value_type >
1082
+ wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
1083
+ noexcept(noexcept(wait_operations::wait_until(
1084
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
1085
+ {
1086
+ BOOST_ASSERT(order != memory_order_release);
1087
+ BOOST_ASSERT(order != memory_order_acq_rel);
1088
+
1089
+ bool timed_out = false;
1090
+ storage_type new_value = wait_operations::wait_until(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
1091
+ return wait_result< value_type >(!!new_value, timed_out);
1092
+ }
1093
+
1094
+ template< typename Rep, typename Period >
1095
+ BOOST_FORCEINLINE wait_result< value_type >
1096
+ wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
1097
+ noexcept(noexcept(wait_operations::wait_for(
1098
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
1099
+ {
1100
+ BOOST_ASSERT(order != memory_order_release);
1101
+ BOOST_ASSERT(order != memory_order_acq_rel);
1102
+
1103
+ bool timed_out = false;
1104
+ storage_type new_value = wait_operations::wait_for(this->storage(), static_cast< storage_type >(old_val), timeout, order, timed_out);
1105
+ return wait_result< value_type >(!!new_value, timed_out);
1106
+ }
842
1107
 
843
1108
  private:
844
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
1109
+ BOOST_FORCEINLINE bool
1110
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
845
1111
  {
846
- return core_operations::compare_exchange_strong(this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
1112
+ return core_operations::compare_exchange_strong(
1113
+ this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
847
1114
  }
848
1115
 
849
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
1116
+ BOOST_FORCEINLINE bool
1117
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
850
1118
  {
851
1119
  storage_type old_value = static_cast< storage_type >(expected);
852
1120
  const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
@@ -854,12 +1122,15 @@ private:
854
1122
  return res;
855
1123
  }
856
1124
 
857
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
1125
+ BOOST_FORCEINLINE bool
1126
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
858
1127
  {
859
- return core_operations::compare_exchange_weak(this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
1128
+ return core_operations::compare_exchange_weak(
1129
+ this->storage(), reinterpret_cast< storage_type& >(expected), static_cast< storage_type >(desired), success_order, failure_order);
860
1130
  }
861
1131
 
862
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
1132
+ BOOST_FORCEINLINE bool
1133
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
863
1134
  {
864
1135
  storage_type old_value = static_cast< storage_type >(expected);
865
1136
  const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, static_cast< storage_type >(desired), success_order, failure_order);
@@ -877,38 +1148,44 @@ class base_atomic< T, float, Interprocess > :
877
1148
  public base_atomic_common< T, false, Interprocess >
878
1149
  {
879
1150
  private:
880
- typedef base_atomic_common< T, false, Interprocess > base_type;
1151
+ using base_type = base_atomic_common< T, false, Interprocess >;
881
1152
 
882
1153
  public:
883
- typedef typename base_type::value_type value_type;
884
- typedef value_type difference_type;
1154
+ using value_type = typename base_type::value_type;
1155
+ using difference_type = value_type;
885
1156
 
886
1157
  protected:
887
- typedef typename base_type::core_operations core_operations;
888
- typedef typename base_type::wait_operations wait_operations;
889
- typedef atomics::detail::extra_operations< core_operations > extra_operations;
890
- typedef atomics::detail::fp_operations< extra_operations, value_type > fp_operations;
891
- typedef atomics::detail::extra_fp_operations< fp_operations > extra_fp_operations;
892
- typedef typename base_type::storage_type storage_type;
893
- typedef value_type value_arg_type;
1158
+ using core_operations = typename base_type::core_operations;
1159
+ using wait_operations = typename base_type::wait_operations;
1160
+ using extra_operations = atomics::detail::extra_operations< core_operations >;
1161
+ using fp_operations = atomics::detail::fp_operations< extra_operations, value_type >;
1162
+ using extra_fp_operations = atomics::detail::extra_fp_operations< fp_operations >;
1163
+ using storage_type = typename base_type::storage_type;
1164
+ using value_arg_type = value_type;
894
1165
 
895
1166
  private:
1167
+ using cxchg_use_bitwise_cast =
896
1168
  #if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
897
- typedef atomics::detail::true_type cxchg_use_bitwise_cast;
1169
+ std::true_type;
898
1170
  #else
899
- typedef atomics::detail::integral_constant< bool,
900
- atomics::detail::value_size_of< value_type >::value != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
901
- > cxchg_use_bitwise_cast;
1171
+ std::integral_constant<
1172
+ bool,
1173
+ atomics::detail::value_size_of< value_type >::value != sizeof(storage_type) ||
1174
+ atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
1175
+ >;
902
1176
  #endif
903
1177
 
904
1178
  public:
905
- BOOST_DEFAULTED_FUNCTION(base_atomic() BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_DECL, BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_IMPL {})
906
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) BOOST_NOEXCEPT :
1179
+ base_atomic() = default;
1180
+ BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) noexcept :
907
1181
  base_type(atomics::detail::bitwise_fp_cast< storage_type >(v))
908
1182
  {
909
1183
  }
910
1184
 
911
- BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1185
+ base_atomic(base_atomic const&) = delete;
1186
+ base_atomic& operator=(base_atomic const&) = delete;
1187
+
1188
+ BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
912
1189
  {
913
1190
  BOOST_ASSERT(order != memory_order_consume);
914
1191
  BOOST_ASSERT(order != memory_order_acquire);
@@ -917,7 +1194,7 @@ public:
917
1194
  core_operations::store(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(v), order);
918
1195
  }
919
1196
 
920
- BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
1197
+ BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
921
1198
  {
922
1199
  BOOST_ASSERT(order != memory_order_release);
923
1200
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -925,22 +1202,22 @@ public:
925
1202
  return atomics::detail::bitwise_fp_cast< value_type >(core_operations::load(this->storage(), order));
926
1203
  }
927
1204
 
928
- BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1205
+ BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
929
1206
  {
930
1207
  return fp_operations::fetch_add(this->storage(), v, order);
931
1208
  }
932
1209
 
933
- BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1210
+ BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
934
1211
  {
935
1212
  return fp_operations::fetch_sub(this->storage(), v, order);
936
1213
  }
937
1214
 
938
- BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1215
+ BOOST_FORCEINLINE value_type exchange(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
939
1216
  {
940
1217
  return atomics::detail::bitwise_fp_cast< value_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(v), order));
941
1218
  }
942
1219
 
943
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
1220
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
944
1221
  {
945
1222
  BOOST_ASSERT(failure_order != memory_order_release);
946
1223
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -949,12 +1226,12 @@ public:
949
1226
  return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
950
1227
  }
951
1228
 
952
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1229
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
953
1230
  {
954
1231
  return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
955
1232
  }
956
1233
 
957
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
1234
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
958
1235
  {
959
1236
  BOOST_ASSERT(failure_order != memory_order_release);
960
1237
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -963,59 +1240,59 @@ public:
963
1240
  return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
964
1241
  }
965
1242
 
966
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1243
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
967
1244
  {
968
1245
  return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
969
1246
  }
970
1247
 
971
1248
  // Boost.Atomic extensions
972
- BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1249
+ BOOST_FORCEINLINE value_type fetch_negate(memory_order order = memory_order_seq_cst) volatile noexcept
973
1250
  {
974
1251
  return extra_fp_operations::fetch_negate(this->storage(), order);
975
1252
  }
976
1253
 
977
- BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1254
+ BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
978
1255
  {
979
1256
  return extra_fp_operations::add(this->storage(), v, order);
980
1257
  }
981
1258
 
982
- BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1259
+ BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
983
1260
  {
984
1261
  return extra_fp_operations::sub(this->storage(), v, order);
985
1262
  }
986
1263
 
987
- BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1264
+ BOOST_FORCEINLINE value_type negate(memory_order order = memory_order_seq_cst) volatile noexcept
988
1265
  {
989
1266
  return extra_fp_operations::negate(this->storage(), order);
990
1267
  }
991
1268
 
992
- BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1269
+ BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
993
1270
  {
994
1271
  extra_fp_operations::opaque_add(this->storage(), v, order);
995
1272
  }
996
1273
 
997
- BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1274
+ BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
998
1275
  {
999
1276
  extra_fp_operations::opaque_sub(this->storage(), v, order);
1000
1277
  }
1001
1278
 
1002
- BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1279
+ BOOST_FORCEINLINE void opaque_negate(memory_order order = memory_order_seq_cst) volatile noexcept
1003
1280
  {
1004
1281
  extra_fp_operations::opaque_negate(this->storage(), order);
1005
1282
  }
1006
1283
 
1007
1284
  // Operators
1008
- BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
1285
+ BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile noexcept
1009
1286
  {
1010
1287
  return add(v);
1011
1288
  }
1012
1289
 
1013
- BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
1290
+ BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile noexcept
1014
1291
  {
1015
1292
  return sub(v);
1016
1293
  }
1017
1294
 
1018
- BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
1295
+ BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
1019
1296
  {
1020
1297
  BOOST_ASSERT(order != memory_order_release);
1021
1298
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -1023,32 +1300,65 @@ public:
1023
1300
  return atomics::detail::bitwise_fp_cast< value_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), order));
1024
1301
  }
1025
1302
 
1026
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
1027
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
1303
+ template< typename Clock, typename Duration >
1304
+ BOOST_FORCEINLINE wait_result< value_type >
1305
+ wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
1306
+ noexcept(noexcept(wait_operations::wait_until(
1307
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
1308
+ {
1309
+ BOOST_ASSERT(order != memory_order_release);
1310
+ BOOST_ASSERT(order != memory_order_acq_rel);
1311
+
1312
+ bool timed_out = false;
1313
+ storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), timeout, order, timed_out);
1314
+ return wait_result< value_type >(atomics::detail::bitwise_fp_cast< value_type >(new_value), timed_out);
1315
+ }
1316
+
1317
+ template< typename Rep, typename Period >
1318
+ BOOST_FORCEINLINE wait_result< value_type >
1319
+ wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
1320
+ noexcept(noexcept(wait_operations::wait_for(
1321
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
1322
+ {
1323
+ BOOST_ASSERT(order != memory_order_release);
1324
+ BOOST_ASSERT(order != memory_order_acq_rel);
1325
+
1326
+ bool timed_out = false;
1327
+ storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_fp_cast< storage_type >(old_val), timeout, order, timed_out);
1328
+ return wait_result< value_type >(atomics::detail::bitwise_fp_cast< value_type >(new_value), timed_out);
1329
+ }
1028
1330
 
1029
1331
  private:
1030
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
1332
+ BOOST_FORCEINLINE bool
1333
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
1031
1334
  {
1032
- return core_operations::compare_exchange_strong(this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1335
+ return core_operations::compare_exchange_strong(
1336
+ this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1033
1337
  }
1034
1338
 
1035
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
1339
+ BOOST_FORCEINLINE bool
1340
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
1036
1341
  {
1037
1342
  storage_type old_value = atomics::detail::bitwise_fp_cast< storage_type >(expected);
1038
- const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1343
+ const bool res = core_operations::compare_exchange_strong(
1344
+ this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1039
1345
  expected = atomics::detail::bitwise_fp_cast< value_type >(old_value);
1040
1346
  return res;
1041
1347
  }
1042
1348
 
1043
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
1349
+ BOOST_FORCEINLINE bool
1350
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
1044
1351
  {
1045
- return core_operations::compare_exchange_weak(this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1352
+ return core_operations::compare_exchange_weak(
1353
+ this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1046
1354
  }
1047
1355
 
1048
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
1356
+ BOOST_FORCEINLINE bool
1357
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
1049
1358
  {
1050
1359
  storage_type old_value = atomics::detail::bitwise_fp_cast< storage_type >(expected);
1051
- const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1360
+ const bool res = core_operations::compare_exchange_weak(
1361
+ this->storage(), old_value, atomics::detail::bitwise_fp_cast< storage_type >(desired), success_order, failure_order);
1052
1362
  expected = atomics::detail::bitwise_fp_cast< value_type >(old_value);
1053
1363
  return res;
1054
1364
  }
@@ -1063,39 +1373,46 @@ class base_atomic< T*, void*, Interprocess > :
1063
1373
  public base_atomic_common< T*, false, Interprocess >
1064
1374
  {
1065
1375
  private:
1066
- typedef base_atomic_common< T*, false, Interprocess > base_type;
1376
+ using base_type = base_atomic_common< T*, false, Interprocess >;
1067
1377
 
1068
1378
  public:
1069
- typedef typename base_type::value_type value_type;
1070
- typedef std::ptrdiff_t difference_type;
1379
+ using value_type = typename base_type::value_type;
1380
+ using difference_type = std::ptrdiff_t;
1071
1381
 
1072
1382
  protected:
1073
- typedef typename base_type::core_operations core_operations;
1074
- typedef typename base_type::wait_operations wait_operations;
1075
- typedef atomics::detail::extra_operations< core_operations > extra_operations;
1076
- typedef typename base_type::storage_type storage_type;
1077
- typedef value_type value_arg_type;
1383
+ using core_operations = typename base_type::core_operations;
1384
+ using wait_operations = typename base_type::wait_operations;
1385
+ using extra_operations = atomics::detail::extra_operations< core_operations >;
1386
+ using storage_type = typename base_type::storage_type;
1387
+ using value_arg_type = value_type;
1078
1388
 
1079
1389
  private:
1390
+ using cxchg_use_bitwise_cast =
1080
1391
  #if !defined(BOOST_ATOMIC_DETAIL_STORAGE_TYPE_MAY_ALIAS) || !defined(BOOST_ATOMIC_NO_CLEAR_PADDING)
1081
- typedef atomics::detail::true_type cxchg_use_bitwise_cast;
1392
+ std::true_type;
1082
1393
  #else
1083
- typedef atomics::detail::integral_constant< bool, sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment > cxchg_use_bitwise_cast;
1394
+ std::integral_constant<
1395
+ bool,
1396
+ sizeof(value_type) != sizeof(storage_type) || atomics::detail::alignment_of< value_type >::value <= core_operations::storage_alignment
1397
+ >;
1084
1398
  #endif
1085
1399
 
1086
1400
  // uintptr_storage_type is the minimal storage type that is enough to store pointers. The actual storage_type theoretically may be larger,
1087
1401
  // if the target architecture only supports atomic ops on larger data. Typically, though, they are the same type.
1088
- typedef atomics::detail::uintptr_t uintptr_storage_type;
1402
+ using uintptr_storage_type = atomics::detail::uintptr_t;
1089
1403
 
1090
1404
  public:
1091
- BOOST_DEFAULTED_FUNCTION(base_atomic() BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_DECL, BOOST_ATOMIC_DETAIL_DEF_NOEXCEPT_IMPL {})
1092
- BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) BOOST_NOEXCEPT :
1405
+ base_atomic() = default;
1406
+ BOOST_FORCEINLINE BOOST_ATOMIC_DETAIL_CONSTEXPR_ATOMIC_CTOR explicit base_atomic(value_arg_type v) noexcept :
1093
1407
  base_type(atomics::detail::bitwise_cast< uintptr_storage_type >(v))
1094
1408
  {
1095
1409
  }
1096
1410
 
1411
+ base_atomic(base_atomic const&) = delete;
1412
+ base_atomic& operator=(base_atomic const&) = delete;
1413
+
1097
1414
  // Standard methods
1098
- BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1415
+ BOOST_FORCEINLINE void store(value_arg_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1099
1416
  {
1100
1417
  BOOST_ASSERT(order != memory_order_consume);
1101
1418
  BOOST_ASSERT(order != memory_order_acquire);
@@ -1104,7 +1421,7 @@ public:
1104
1421
  core_operations::store(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(v), order);
1105
1422
  }
1106
1423
 
1107
- BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
1424
+ BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile noexcept
1108
1425
  {
1109
1426
  BOOST_ASSERT(order != memory_order_release);
1110
1427
  BOOST_ASSERT(order != memory_order_acq_rel);
@@ -1112,22 +1429,25 @@ public:
1112
1429
  return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(core_operations::load(this->storage(), order)));
1113
1430
  }
1114
1431
 
1115
- BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1432
+ BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1116
1433
  {
1117
- return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(core_operations::fetch_add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1434
+ return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
1435
+ core_operations::fetch_add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1118
1436
  }
1119
1437
 
1120
- BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1438
+ BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1121
1439
  {
1122
- return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(core_operations::fetch_sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1440
+ return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
1441
+ core_operations::fetch_sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1123
1442
  }
1124
1443
 
1125
- BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1444
+ BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1126
1445
  {
1127
- return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(v), order)));
1446
+ return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
1447
+ core_operations::exchange(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(v), order)));
1128
1448
  }
1129
1449
 
1130
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
1450
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
1131
1451
  {
1132
1452
  BOOST_ASSERT(failure_order != memory_order_release);
1133
1453
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -1136,12 +1456,12 @@ public:
1136
1456
  return compare_exchange_strong_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
1137
1457
  }
1138
1458
 
1139
- BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1459
+ BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
1140
1460
  {
1141
1461
  return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
1142
1462
  }
1143
1463
 
1144
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
1464
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order) volatile noexcept
1145
1465
  {
1146
1466
  BOOST_ASSERT(failure_order != memory_order_release);
1147
1467
  BOOST_ASSERT(failure_order != memory_order_acq_rel);
@@ -1150,107 +1470,143 @@ public:
1150
1470
  return compare_exchange_weak_impl(expected, desired, success_order, failure_order, cxchg_use_bitwise_cast());
1151
1471
  }
1152
1472
 
1153
- BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1473
+ BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_arg_type desired, memory_order order = memory_order_seq_cst) volatile noexcept
1154
1474
  {
1155
1475
  return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
1156
1476
  }
1157
1477
 
1158
1478
  // Boost.Atomic extensions
1159
- BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1479
+ BOOST_FORCEINLINE value_type add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1160
1480
  {
1161
- return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(extra_operations::add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1481
+ return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
1482
+ extra_operations::add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1162
1483
  }
1163
1484
 
1164
- BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1485
+ BOOST_FORCEINLINE value_type sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1165
1486
  {
1166
- return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(extra_operations::sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1487
+ return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
1488
+ extra_operations::sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order)));
1167
1489
  }
1168
1490
 
1169
- BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1491
+ BOOST_FORCEINLINE void opaque_add(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1170
1492
  {
1171
1493
  extra_operations::opaque_add(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
1172
1494
  }
1173
1495
 
1174
- BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1496
+ BOOST_FORCEINLINE void opaque_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1175
1497
  {
1176
1498
  extra_operations::opaque_sub(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
1177
1499
  }
1178
1500
 
1179
- BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1501
+ BOOST_FORCEINLINE bool add_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1180
1502
  {
1181
1503
  return extra_operations::add_and_test(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
1182
1504
  }
1183
1505
 
1184
- BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
1506
+ BOOST_FORCEINLINE bool sub_and_test(difference_type v, memory_order order = memory_order_seq_cst) volatile noexcept
1185
1507
  {
1186
1508
  return extra_operations::sub_and_test(this->storage(), static_cast< uintptr_storage_type >(v * sizeof(T)), order);
1187
1509
  }
1188
1510
 
1189
1511
  // Operators
1190
- BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
1512
+ BOOST_FORCEINLINE value_type operator++(int) volatile noexcept
1191
1513
  {
1192
1514
  return fetch_add(1);
1193
1515
  }
1194
1516
 
1195
- BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
1517
+ BOOST_FORCEINLINE value_type operator++() volatile noexcept
1196
1518
  {
1197
1519
  return add(1);
1198
1520
  }
1199
1521
 
1200
- BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
1522
+ BOOST_FORCEINLINE value_type operator--(int) volatile noexcept
1201
1523
  {
1202
1524
  return fetch_sub(1);
1203
1525
  }
1204
1526
 
1205
- BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
1527
+ BOOST_FORCEINLINE value_type operator--() volatile noexcept
1206
1528
  {
1207
1529
  return sub(1);
1208
1530
  }
1209
1531
 
1210
- BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
1532
+ BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile noexcept
1211
1533
  {
1212
1534
  return add(v);
1213
1535
  }
1214
1536
 
1215
- BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
1537
+ BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile noexcept
1216
1538
  {
1217
1539
  return sub(v);
1218
1540
  }
1219
1541
 
1220
- BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
1542
+ BOOST_FORCEINLINE value_type wait(value_arg_type old_val, memory_order order = memory_order_seq_cst) const volatile noexcept
1221
1543
  {
1222
1544
  BOOST_ASSERT(order != memory_order_release);
1223
1545
  BOOST_ASSERT(order != memory_order_acq_rel);
1224
1546
 
1225
- return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), order)));
1547
+ return atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(
1548
+ wait_operations::wait(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), order)));
1226
1549
  }
1227
1550
 
1228
- BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
1229
- BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
1551
+ template< typename Clock, typename Duration >
1552
+ BOOST_FORCEINLINE wait_result< value_type >
1553
+ wait_until(value_arg_type old_val, std::chrono::time_point< Clock, Duration > timeout, memory_order order = memory_order_seq_cst) const volatile
1554
+ noexcept(noexcept(wait_operations::wait_until(
1555
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
1556
+ {
1557
+ BOOST_ASSERT(order != memory_order_release);
1558
+ BOOST_ASSERT(order != memory_order_acq_rel);
1559
+
1560
+ bool timed_out = false;
1561
+ storage_type new_value = wait_operations::wait_until(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), timeout, order, timed_out);
1562
+ return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
1563
+ }
1564
+
1565
+ template< typename Rep, typename Period >
1566
+ BOOST_FORCEINLINE wait_result< value_type >
1567
+ wait_for(value_arg_type old_val, std::chrono::duration< Rep, Period > timeout, memory_order order = memory_order_seq_cst) const volatile
1568
+ noexcept(noexcept(wait_operations::wait_for(
1569
+ std::declval< storage_type const volatile& >(), std::declval< storage_type >(), timeout, order, std::declval< bool& >())))
1570
+ {
1571
+ BOOST_ASSERT(order != memory_order_release);
1572
+ BOOST_ASSERT(order != memory_order_acq_rel);
1573
+
1574
+ bool timed_out = false;
1575
+ storage_type new_value = wait_operations::wait_for(this->storage(), atomics::detail::bitwise_cast< uintptr_storage_type >(old_val), timeout, order, timed_out);
1576
+ return wait_result< value_type >(atomics::detail::bitwise_cast< value_type >(new_value), timed_out);
1577
+ }
1230
1578
 
1231
1579
  private:
1232
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
1580
+ BOOST_FORCEINLINE bool
1581
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
1233
1582
  {
1234
- return core_operations::compare_exchange_strong(this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1583
+ return core_operations::compare_exchange_strong(
1584
+ this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1235
1585
  }
1236
1586
 
1237
- BOOST_FORCEINLINE bool compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
1587
+ BOOST_FORCEINLINE bool
1588
+ compare_exchange_strong_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
1238
1589
  {
1239
1590
  storage_type old_value = atomics::detail::bitwise_cast< uintptr_storage_type >(expected);
1240
- const bool res = core_operations::compare_exchange_strong(this->storage(), old_value, atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1591
+ const bool res = core_operations::compare_exchange_strong(
1592
+ this->storage(), old_value, atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1241
1593
  expected = atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(old_value));
1242
1594
  return res;
1243
1595
  }
1244
1596
 
1245
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::false_type) volatile BOOST_NOEXCEPT
1597
+ BOOST_FORCEINLINE bool
1598
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::false_type) volatile noexcept
1246
1599
  {
1247
- return core_operations::compare_exchange_weak(this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1600
+ return core_operations::compare_exchange_weak(
1601
+ this->storage(), reinterpret_cast< storage_type& >(expected), atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1248
1602
  }
1249
1603
 
1250
- BOOST_FORCEINLINE bool compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, atomics::detail::true_type) volatile BOOST_NOEXCEPT
1604
+ BOOST_FORCEINLINE bool
1605
+ compare_exchange_weak_impl(value_type& expected, value_arg_type desired, memory_order success_order, memory_order failure_order, std::true_type) volatile noexcept
1251
1606
  {
1252
1607
  storage_type old_value = atomics::detail::bitwise_cast< uintptr_storage_type >(expected);
1253
- const bool res = core_operations::compare_exchange_weak(this->storage(), old_value, atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1608
+ const bool res = core_operations::compare_exchange_weak(
1609
+ this->storage(), old_value, atomics::detail::bitwise_cast< uintptr_storage_type >(desired), success_order, failure_order);
1254
1610
  expected = atomics::detail::bitwise_cast< value_type >(static_cast< uintptr_storage_type >(old_value));
1255
1611
  return res;
1256
1612
  }