passenger 6.0.1 → 6.0.6

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 (453) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +145 -18
  3. data/CONTRIBUTORS +6 -0
  4. data/bin/passenger-install-nginx-module +1 -1
  5. data/bin/passenger-status +15 -0
  6. data/build/misc.rb +3 -1
  7. data/build/support/vendor/cxxcodebuilder/lib/cxxcodebuilder/builder.rb +56 -3
  8. data/dev/copy_boost_headers +1 -0
  9. data/package.json +1 -1
  10. data/passenger.gemspec +9 -1
  11. data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.css +0 -0
  12. data/resources/templates/error_renderer/with_details/src/bootstrap/bootstrap.js +0 -0
  13. data/resources/templates/error_renderer/with_details/src/bootstrap/config.json +0 -0
  14. data/resources/templates/standalone/http.erb +2 -0
  15. data/resources/templates/standalone/server.erb +1 -0
  16. data/src/agent/Core/ApplicationPool/Group/ProcessListManagement.cpp +1 -1
  17. data/src/agent/Core/ApplicationPool/Group/StateInspection.cpp +1 -0
  18. data/src/agent/Core/ApplicationPool/Options.h +10 -0
  19. data/src/agent/Core/ApplicationPool/Pool/GarbageCollection.cpp +1 -1
  20. data/src/agent/Core/ApplicationPool/Pool/StateInspection.cpp +1 -1
  21. data/src/agent/Core/Config.h +14 -1
  22. data/src/agent/Core/Controller.h +1 -0
  23. data/src/agent/Core/Controller/Config.h +5 -1
  24. data/src/agent/Core/Controller/ForwardResponse.cpp +13 -0
  25. data/src/agent/Core/Controller/InitRequest.cpp +3 -0
  26. data/src/agent/Core/Controller/InitializationAndShutdown.cpp +1 -0
  27. data/src/agent/Core/CoreMain.cpp +2 -1
  28. data/src/agent/Core/OptionParser.h +3 -0
  29. data/src/agent/Core/SpawningKit/Context.h +1 -0
  30. data/src/agent/Core/SpawningKit/Handshake/Prepare.h +1 -1
  31. data/src/agent/Core/SpawningKit/Handshake/WorkDir.h +5 -2
  32. data/src/agent/TempDirToucher/TempDirToucherMain.cpp +2 -0
  33. data/src/agent/Watchdog/Config.h +15 -1
  34. data/src/agent/Watchdog/WatchdogMain.cpp +7 -0
  35. data/src/apache2_module/ConfigGeneral/AutoGeneratedDefinitions.cpp +10 -0
  36. data/src/apache2_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.cpp +10 -0
  37. data/src/apache2_module/ConfigGeneral/AutoGeneratedSetterFuncs.cpp +30 -0
  38. data/src/apache2_module/Hooks.cpp +6 -0
  39. data/src/apache2_module/ServerConfig/AutoGeneratedManifestGeneration.cpp +20 -0
  40. data/src/apache2_module/ServerConfig/AutoGeneratedStruct.h +24 -0
  41. data/src/cxx_supportlib/Constants.h +2 -1
  42. data/src/cxx_supportlib/LoggingKit/Config.h +2 -0
  43. data/src/cxx_supportlib/LoggingKit/Implementation.cpp +15 -9
  44. data/src/cxx_supportlib/ServerKit/HttpChunkedBodyParser.h +1 -1
  45. data/src/cxx_supportlib/SystemTools/ContainerHelpers.h +20 -19
  46. data/src/cxx_supportlib/WebSocketCommandReverseServer.h +11 -7
  47. data/src/cxx_supportlib/oxt/system_calls.cpp +10 -10
  48. data/src/cxx_supportlib/vendor-modified/boost/algorithm/string/finder.hpp +0 -4
  49. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +46 -37
  50. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +16 -15
  51. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +45 -26
  52. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/future.hpp +33 -0
  53. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +1 -1
  54. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_buffer_sequence.hpp +38 -14
  55. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue.hpp +2 -0
  56. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.hpp +1 -1
  57. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +3 -1
  58. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_future.hpp +0 -1
  59. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/bad_address_cast.hpp +6 -1
  60. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +6 -4
  61. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_results.hpp +4 -4
  62. data/src/cxx_supportlib/vendor-modified/boost/asio/packaged_task.hpp +3 -3
  63. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +4 -4
  64. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +4 -4
  65. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +8 -6
  66. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context_base.hpp +17 -0
  67. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +50 -5
  68. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +2 -1
  69. data/src/cxx_supportlib/vendor-modified/boost/asio/thread_pool.hpp +1 -1
  70. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +3 -2
  71. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +1 -1
  72. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +4 -3
  73. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +5 -3
  74. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/ops_gcc_x86_dcas.hpp +13 -12
  75. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/chrono.hpp +10 -10
  76. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/process_cpu_clocks.hpp +34 -34
  77. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/mac/thread_clock.hpp +4 -4
  78. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/chrono.hpp +8 -8
  79. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/process_cpu_clocks.hpp +27 -27
  80. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/inlined/posix/thread_clock.hpp +4 -4
  81. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/system.hpp +5 -4
  82. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/time_point_io.hpp +1 -1
  83. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer.hpp +3 -3
  84. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/allocators.hpp +89 -0
  85. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/base.hpp +83 -74
  86. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/details.hpp +21 -33
  87. data/src/cxx_supportlib/vendor-modified/boost/circular_buffer/space_optimized.hpp +5 -5
  88. data/src/cxx_supportlib/vendor-modified/boost/concept/assert.hpp +1 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/concept/detail/general.hpp +3 -3
  90. data/src/cxx_supportlib/vendor-modified/boost/concept/detail/has_constraints.hpp +3 -3
  91. data/src/cxx_supportlib/vendor-modified/boost/concept/usage.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/concept_check.hpp +19 -19
  93. data/src/cxx_supportlib/vendor-modified/boost/config/auto_link.hpp +8 -0
  94. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +5 -2
  95. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +5 -1
  96. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +6 -2
  97. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/comeau.hpp +1 -1
  98. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +4 -0
  99. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +368 -52
  100. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +4 -1
  101. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +6 -3
  102. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +3 -0
  103. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/greenhills.hpp +1 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +1 -1
  105. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +6 -1
  106. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/kai.hpp +1 -1
  107. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +4 -1
  108. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +4 -1
  109. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/nvcc.hpp +3 -3
  110. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +3 -0
  111. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +3 -0
  112. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +4 -1
  113. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +9 -4
  114. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +4 -0
  115. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp_zos.hpp +1 -0
  116. data/src/cxx_supportlib/vendor-modified/boost/config/detail/select_compiler_config.hpp +1 -2
  117. data/src/cxx_supportlib/vendor-modified/boost/config/detail/suffix.hpp +13 -0
  118. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +2 -2
  119. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libcpp.hpp +14 -4
  120. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +4 -4
  121. data/src/cxx_supportlib/vendor-modified/boost/container/adaptive_pool.hpp +262 -2
  122. data/src/cxx_supportlib/vendor-modified/boost/container/allocator.hpp +4 -3
  123. data/src/cxx_supportlib/vendor-modified/boost/container/allocator_traits.hpp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +7 -0
  125. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool.hpp +22 -19
  126. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +833 -459
  127. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +24 -6
  128. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocator_version_traits.hpp +2 -1
  129. data/src/cxx_supportlib/vendor-modified/boost/container/detail/compare_functors.hpp +61 -5
  130. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +33 -8
  131. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +132 -41
  132. data/src/cxx_supportlib/vendor-modified/boost/container/detail/iterator.hpp +16 -0
  133. data/src/cxx_supportlib/vendor-modified/boost/container/detail/math_functions.hpp +54 -0
  134. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mpl.hpp +58 -0
  135. data/src/cxx_supportlib/vendor-modified/boost/container/detail/multiallocation_chain.hpp +28 -23
  136. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +167 -115
  137. data/src/cxx_supportlib/vendor-modified/boost/container/detail/pair.hpp +55 -0
  138. data/src/cxx_supportlib/vendor-modified/boost/container/detail/std_fwd.hpp +3 -0
  139. data/src/cxx_supportlib/vendor-modified/boost/container/detail/thread_mutex.hpp +181 -0
  140. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +167 -29
  141. data/src/cxx_supportlib/vendor-modified/boost/container/detail/type_traits.hpp +2 -0
  142. data/src/cxx_supportlib/vendor-modified/boost/container/detail/variadic_templates_tools.hpp +1 -1
  143. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +18 -0
  144. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +389 -3
  145. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +262 -0
  146. data/src/cxx_supportlib/vendor-modified/boost/container/list.hpp +52 -8
  147. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +364 -0
  148. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/monotonic_buffer_resource.hpp +4 -2
  149. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/resource_adaptor.hpp +1 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/synchronized_pool_resource.hpp +3 -2
  151. data/src/cxx_supportlib/vendor-modified/boost/container/set.hpp +286 -6
  152. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +56 -8
  153. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +43 -6
  154. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +100 -31
  155. data/src/cxx_supportlib/vendor-modified/boost/container/static_vector.hpp +2 -1
  156. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +126 -69
  157. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +75 -51
  158. data/src/cxx_supportlib/vendor-modified/boost/core/empty_value.hpp +136 -0
  159. data/src/cxx_supportlib/vendor-modified/boost/core/exchange.hpp +49 -0
  160. data/src/cxx_supportlib/vendor-modified/boost/core/explicit_operator_bool.hpp +9 -0
  161. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +101 -130
  162. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test_trait.hpp +2 -2
  163. data/src/cxx_supportlib/vendor-modified/boost/core/noncopyable.hpp +16 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/core/quick_exit.hpp +59 -0
  165. data/src/cxx_supportlib/vendor-modified/boost/core/ref.hpp +2 -1
  166. data/src/cxx_supportlib/vendor-modified/boost/core/swap.hpp +9 -2
  167. data/src/cxx_supportlib/vendor-modified/boost/core/typeinfo.hpp +26 -10
  168. data/src/cxx_supportlib/vendor-modified/boost/date_time/compiler_config.hpp +5 -0
  169. data/src/cxx_supportlib/vendor-modified/boost/date_time/posix_time/posix_time_duration.hpp +3 -3
  170. data/src/cxx_supportlib/vendor-modified/boost/date_time/time_duration.hpp +1 -1
  171. data/src/cxx_supportlib/vendor-modified/boost/detail/basic_pointerbuf.hpp +1 -1
  172. data/src/cxx_supportlib/vendor-modified/boost/detail/indirect_traits.hpp +38 -47
  173. data/src/cxx_supportlib/vendor-modified/boost/detail/lcast_precision.hpp +5 -5
  174. data/src/cxx_supportlib/vendor-modified/boost/detail/reference_content.hpp +7 -7
  175. data/src/cxx_supportlib/vendor-modified/boost/exception/exception.hpp +62 -58
  176. data/src/cxx_supportlib/vendor-modified/boost/function.hpp +1 -1
  177. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +29 -29
  178. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +38 -40
  179. data/src/cxx_supportlib/vendor-modified/boost/integer/common_factor_rt.hpp +4 -4
  180. data/src/cxx_supportlib/vendor-modified/boost/intrusive/avltree_algorithms.hpp +44 -44
  181. data/src/cxx_supportlib/vendor-modified/boost/intrusive/bstree_algorithms.hpp +39 -39
  182. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +15 -15
  183. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_slist_algorithms.hpp +7 -7
  184. data/src/cxx_supportlib/vendor-modified/boost/intrusive/derivation_value_traits.hpp +1 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/any_node_and_algorithms.hpp +14 -14
  186. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/avltree_node.hpp +9 -9
  187. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +7 -7
  188. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_iterator.hpp +1 -1
  189. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/list_node.hpp +2 -2
  190. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/node_cloner_disposer.hpp +2 -2
  191. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/rbtree_node.hpp +6 -6
  192. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/simple_disposers.hpp +1 -1
  193. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +1 -1
  194. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_node.hpp +1 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_iterator.hpp +1 -1
  196. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_node.hpp +3 -3
  197. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/tree_value_compare.hpp +33 -14
  198. data/src/cxx_supportlib/vendor-modified/boost/intrusive/hashtable.hpp +12 -12
  199. data/src/cxx_supportlib/vendor-modified/boost/intrusive/linear_slist_algorithms.hpp +4 -4
  200. data/src/cxx_supportlib/vendor-modified/boost/intrusive/pointer_plus_bits.hpp +3 -0
  201. data/src/cxx_supportlib/vendor-modified/boost/intrusive/rbtree_algorithms.hpp +39 -39
  202. data/src/cxx_supportlib/vendor-modified/boost/intrusive/sgtree_algorithms.hpp +61 -61
  203. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +4 -4
  204. data/src/cxx_supportlib/vendor-modified/boost/intrusive/splaytree_algorithms.hpp +66 -66
  205. data/src/cxx_supportlib/vendor-modified/boost/intrusive/treap_algorithms.hpp +54 -54
  206. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set.hpp +6 -2
  207. data/src/cxx_supportlib/vendor-modified/boost/intrusive/unordered_set_hook.hpp +3 -3
  208. data/src/cxx_supportlib/vendor-modified/boost/iterator/advance.hpp +1 -1
  209. data/src/cxx_supportlib/vendor-modified/boost/iterator/distance.hpp +65 -0
  210. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +1 -1
  212. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +23 -23
  213. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +4 -4
  214. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +13 -13
  215. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +1 -1
  216. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +5 -4
  217. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
  218. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +5 -5
  219. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +5 -2
  220. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +18 -13
  221. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/cregex.cpp +4 -4
  222. data/src/cxx_supportlib/vendor-modified/boost/libs/system/src/error_code.cpp +16 -5
  223. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/future.cpp +1 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/pthread/thread.cpp +14 -8
  225. data/src/cxx_supportlib/vendor-modified/boost/libs/thread/src/tss_null.cpp +2 -2
  226. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/detail/fp_traits.hpp +13 -13
  227. data/src/cxx_supportlib/vendor-modified/boost/math/special_functions/math_fwd.hpp +27 -0
  228. data/src/cxx_supportlib/vendor-modified/boost/math/tools/config.hpp +1 -1
  229. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +29 -6
  230. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +12 -3
  231. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +1 -1
  232. data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +1 -1
  233. data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +1 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/move/core.hpp +8 -8
  235. data/src/cxx_supportlib/vendor-modified/boost/move/detail/meta_utils.hpp +2 -0
  236. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +3 -3
  237. data/src/cxx_supportlib/vendor-modified/boost/mpl/assert.hpp +23 -3
  238. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/experimental_traits.hpp +9 -3
  239. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +10 -11
  240. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +20 -1
  241. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +3 -3
  242. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +211 -101
  243. data/src/cxx_supportlib/vendor-modified/boost/parameter/python.hpp +5 -6
  244. data/src/cxx_supportlib/vendor-modified/boost/pool/detail/mutex.hpp +119 -25
  245. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture.h +1 -0
  246. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/arm.h +5 -0
  247. data/src/cxx_supportlib/vendor-modified/boost/predef/architecture/ptx.h +44 -0
  248. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler.h +1 -0
  249. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/compaq.h +1 -1
  250. data/src/cxx_supportlib/vendor-modified/boost/predef/compiler/nvcc.h +73 -0
  251. data/src/cxx_supportlib/vendor-modified/boost/predef/detail/endian_compat.h +3 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/predef/language.h +1 -0
  253. data/src/cxx_supportlib/vendor-modified/boost/predef/language/cuda.h +52 -0
  254. data/src/cxx_supportlib/vendor-modified/boost/predef/make.h +4 -0
  255. data/src/cxx_supportlib/vendor-modified/boost/predef/os/cygwin.h +6 -1
  256. data/src/cxx_supportlib/vendor-modified/boost/predef/other/endian.h +1 -2
  257. data/src/cxx_supportlib/vendor-modified/boost/predef/version.h +1 -1
  258. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/config/config.hpp +17 -8
  259. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/stringize.hpp +4 -0
  260. data/src/cxx_supportlib/vendor-modified/boost/preprocessor/wstringize.hpp +4 -0
  261. data/src/cxx_supportlib/vendor-modified/boost/random/detail/gray_coded_qrng.hpp +166 -0
  262. data/src/cxx_supportlib/vendor-modified/boost/random/detail/niederreiter_base2_table.hpp +513 -0
  263. data/src/cxx_supportlib/vendor-modified/boost/random/detail/qrng_base.hpp +291 -0
  264. data/src/cxx_supportlib/vendor-modified/boost/random/detail/sobol_table.hpp +4106 -0
  265. data/src/cxx_supportlib/vendor-modified/boost/random/faure.hpp +367 -0
  266. data/src/cxx_supportlib/vendor-modified/boost/random/niederreiter_base2.hpp +360 -0
  267. data/src/cxx_supportlib/vendor-modified/boost/random/sobol.hpp +237 -0
  268. data/src/cxx_supportlib/vendor-modified/boost/range/as_literal.hpp +43 -0
  269. data/src/cxx_supportlib/vendor-modified/boost/range/begin.hpp +13 -5
  270. data/src/cxx_supportlib/vendor-modified/boost/range/concepts.hpp +1 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/range/detail/common.hpp +1 -3
  272. data/src/cxx_supportlib/vendor-modified/boost/range/detail/implementation_help.hpp +2 -2
  273. data/src/cxx_supportlib/vendor-modified/boost/range/distance.hpp +11 -5
  274. data/src/cxx_supportlib/vendor-modified/boost/range/end.hpp +14 -6
  275. data/src/cxx_supportlib/vendor-modified/boost/range/has_range_iterator.hpp +3 -3
  276. data/src/cxx_supportlib/vendor-modified/boost/ratio/config.hpp +6 -2
  277. data/src/cxx_supportlib/vendor-modified/boost/rational.hpp +55 -37
  278. data/src/cxx_supportlib/vendor-modified/boost/regex/concepts.hpp +3 -2
  279. data/src/cxx_supportlib/vendor-modified/boost/regex/config.hpp +11 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex.hpp +7 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_creator.hpp +3 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/basic_regex_parser.hpp +5 -2
  283. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/fileiter.hpp +0 -3
  284. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/instances.hpp +15 -4
  285. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_flags.hpp +1 -2
  286. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/match_results.hpp +12 -3
  287. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher.hpp +7 -2
  288. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_common.hpp +7 -3
  289. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/perl_matcher_non_recursive.hpp +6 -2
  290. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_format.hpp +0 -5
  291. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_iterator.hpp +0 -8
  292. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_raw_buffer.hpp +3 -3
  293. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_split.hpp +3 -1
  294. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_token_iterator.hpp +0 -8
  295. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_traits_defaults.hpp +12 -11
  296. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +7 -4
  297. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_iterator.hpp +1 -9
  298. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/u32regex_token_iterator.hpp +2 -10
  299. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/w32_regex_traits.hpp +2 -0
  300. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +60 -115
  301. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/local_counted_base.hpp +3 -3
  302. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +2 -1
  303. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_aix.hpp +2 -1
  304. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_clang.hpp +2 -1
  305. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +2 -1
  306. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +2 -1
  307. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +2 -1
  308. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +2 -1
  309. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +2 -1
  310. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +2 -1
  311. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +2 -1
  312. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_nt.hpp +2 -1
  313. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_pt.hpp +2 -1
  314. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +2 -1
  315. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +2 -1
  316. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_spin.hpp +2 -1
  317. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp +2 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_sync.hpp +2 -1
  319. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +2 -1
  320. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_impl.hpp +3 -3
  321. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/yield_k.hpp +14 -8
  322. data/src/cxx_supportlib/vendor-modified/boost/system/config.hpp +4 -24
  323. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +57 -0
  324. data/src/cxx_supportlib/vendor-modified/boost/system/detail/generic_category.hpp +101 -0
  325. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_interoperability.hpp +141 -0
  326. data/src/cxx_supportlib/vendor-modified/boost/system/detail/system_category_posix.hpp +132 -0
  327. data/src/cxx_supportlib/vendor-modified/boost/system/error_code.hpp +775 -588
  328. data/src/cxx_supportlib/vendor-modified/boost/system/system_error.hpp +4 -4
  329. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/config.hpp +6 -0
  330. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/move.hpp +13 -6
  331. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/nullary_function.hpp +8 -3
  332. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread.hpp +3 -1
  333. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/thread_safety.hpp +160 -0
  334. data/src/cxx_supportlib/vendor-modified/boost/thread/detail/tss_hooks.hpp +2 -2
  335. data/src/cxx_supportlib/vendor-modified/boost/thread/exceptions.hpp +3 -3
  336. data/src/cxx_supportlib/vendor-modified/boost/thread/executors/basic_thread_pool.hpp +24 -1
  337. data/src/cxx_supportlib/vendor-modified/boost/thread/future.hpp +10 -1
  338. data/src/cxx_supportlib/vendor-modified/boost/thread/lock_guard.hpp +4 -4
  339. data/src/cxx_supportlib/vendor-modified/boost/thread/lockable_traits.hpp +31 -0
  340. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable.hpp +2 -2
  341. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/condition_variable_fwd.hpp +2 -2
  342. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/mutex.hpp +8 -53
  343. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +73 -4
  344. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/recursive_mutex.hpp +6 -6
  345. data/src/cxx_supportlib/vendor-modified/boost/thread/pthread/thread_data.hpp +14 -9
  346. data/src/cxx_supportlib/vendor-modified/boost/thread/xtime.hpp +6 -6
  347. data/src/cxx_supportlib/vendor-modified/boost/throw_exception.hpp +9 -8
  348. data/src/cxx_supportlib/vendor-modified/boost/token_functions.hpp +1 -0
  349. data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +21 -19
  350. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/common_arithmetic_type.hpp +3 -1
  351. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/config.hpp +9 -0
  352. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/detector.hpp +1 -1
  353. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/has_postfix_operator.hpp +55 -0
  354. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/has_prefix_operator.hpp +72 -0
  355. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_03.hpp +108 -0
  356. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_cxx_11.hpp +501 -0
  357. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_function_msvc10_fix.hpp +30 -0
  358. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_likely_lambda.hpp +2 -2
  359. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_03.hpp +117 -0
  360. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_member_function_pointer_cxx_11.hpp +557 -0
  361. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_rvalue_reference_msvc10_fix.hpp +43 -0
  362. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detected.hpp +1 -1
  363. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detected_or.hpp +1 -1
  364. data/src/cxx_supportlib/vendor-modified/boost/type_traits/enable_if.hpp +37 -0
  365. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_dereference.hpp +344 -0
  366. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_minus.hpp +5 -0
  367. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_minus_assign.hpp +5 -0
  368. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_plus_assign.hpp +5 -0
  369. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_post_decrement.hpp +21 -0
  370. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_post_increment.hpp +21 -0
  371. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_pre_decrement.hpp +21 -0
  372. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_pre_increment.hpp +22 -0
  373. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_assign.hpp +1 -1
  374. data/src/cxx_supportlib/vendor-modified/boost/type_traits/has_trivial_move_constructor.hpp +2 -1
  375. data/src/cxx_supportlib/vendor-modified/boost/type_traits/integral_constant.hpp +5 -15
  376. data/src/cxx_supportlib/vendor-modified/boost/type_traits/intrinsics.hpp +16 -6
  377. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_complete.hpp +3 -1
  378. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_copy_assignable.hpp +3 -4
  379. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_copy_constructible.hpp +4 -6
  380. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected.hpp +1 -1
  381. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected_convertible.hpp +1 -1
  382. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_detected_exact.hpp +1 -1
  383. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_final.hpp +1 -1
  384. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_function.hpp +4 -79
  385. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_member_function_pointer.hpp +3 -97
  386. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_noncopyable.hpp +39 -0
  387. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_assignable.hpp +2 -2
  388. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_move_constructible.hpp +2 -2
  389. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_rvalue_reference.hpp +4 -0
  390. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_virtual_base_of.hpp +104 -63
  391. data/src/cxx_supportlib/vendor-modified/boost/type_traits/make_void.hpp +1 -1
  392. data/src/cxx_supportlib/vendor-modified/boost/type_traits/nonesuch.hpp +1 -1
  393. data/src/cxx_supportlib/vendor-modified/boost/typeof/constant.hpp +26 -0
  394. data/src/cxx_supportlib/vendor-modified/boost/typeof/dmc/typeof_impl.hpp +4 -4
  395. data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode.hpp +0 -3
  396. data/src/cxx_supportlib/vendor-modified/boost/typeof/encode_decode_params.hpp +1 -1
  397. data/src/cxx_supportlib/vendor-modified/boost/typeof/int_encoding.hpp +4 -5
  398. data/src/cxx_supportlib/vendor-modified/boost/typeof/modifiers.hpp +5 -5
  399. data/src/cxx_supportlib/vendor-modified/boost/typeof/msvc/typeof_impl.hpp +9 -9
  400. data/src/cxx_supportlib/vendor-modified/boost/typeof/native.hpp +3 -3
  401. data/src/cxx_supportlib/vendor-modified/boost/typeof/pointers_data_members.hpp +2 -2
  402. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_functions_iterate.hpp +6 -6
  403. data/src/cxx_supportlib/vendor-modified/boost/typeof/register_mem_functions.hpp +1 -1
  404. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_encoding.hpp +4 -4
  405. data/src/cxx_supportlib/vendor-modified/boost/typeof/template_template_param.hpp +2 -2
  406. data/src/cxx_supportlib/vendor-modified/boost/typeof/type_encoding.hpp +2 -2
  407. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof_impl.hpp +16 -16
  408. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector.hpp +5 -5
  409. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector100.hpp +201 -201
  410. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector150.hpp +301 -301
  411. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector200.hpp +401 -401
  412. data/src/cxx_supportlib/vendor-modified/boost/typeof/vector50.hpp +101 -101
  413. data/src/cxx_supportlib/vendor-modified/boost/utility/detail/minstd_rand.hpp +3 -0
  414. data/src/cxx_supportlib/vendor-modified/boost/utility/string_ref.hpp +2 -0
  415. data/src/cxx_supportlib/vendor-modified/boost/utility/string_view.hpp +26 -6
  416. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  417. data/src/helper-scripts/prespawn +1 -0
  418. data/src/nginx_module/ConfigGeneral/AutoGeneratedDefinitions.c +40 -0
  419. data/src/nginx_module/ConfigGeneral/AutoGeneratedManifestDefaultsInitialization.c +26 -0
  420. data/src/nginx_module/ConfigGeneral/AutoGeneratedSetterFuncs.c +48 -0
  421. data/src/nginx_module/Configuration.c +6 -2
  422. data/src/nginx_module/ContentHandler.c +5 -1
  423. data/src/nginx_module/LocationConfig/AutoGeneratedCreateFunction.c +15 -0
  424. data/src/nginx_module/LocationConfig/AutoGeneratedHeaderSerialization.c +15 -0
  425. data/src/nginx_module/LocationConfig/AutoGeneratedManifestGeneration.c +28 -0
  426. data/src/nginx_module/LocationConfig/AutoGeneratedMergeFunction.c +6 -0
  427. data/src/nginx_module/LocationConfig/AutoGeneratedStruct.h +11 -0
  428. data/src/nginx_module/MainConfig/AutoGeneratedCreateFunction.c +11 -0
  429. data/src/nginx_module/MainConfig/AutoGeneratedManifestGeneration.c +23 -0
  430. data/src/nginx_module/MainConfig/AutoGeneratedStruct.h +8 -0
  431. data/src/nginx_module/ngx_http_passenger_module.c +2 -0
  432. data/src/nodejs_supportlib/vendor-copy/winston/lib/winston/logger.js +0 -0
  433. data/src/ruby_native_extension/extconf.rb +7 -0
  434. data/src/ruby_supportlib/phusion_passenger.rb +7 -7
  435. data/src/ruby_supportlib/phusion_passenger/admin_tools/instance_registry.rb +8 -0
  436. data/src/ruby_supportlib/phusion_passenger/apache2/config_options.rb +23 -0
  437. data/src/ruby_supportlib/phusion_passenger/constants.rb +1 -0
  438. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +1 -3
  439. data/src/ruby_supportlib/phusion_passenger/nginx/config_options.rb +37 -0
  440. data/src/ruby_supportlib/phusion_passenger/platform_info/compiler.rb +1 -1
  441. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +10 -0
  442. data/src/ruby_supportlib/phusion_passenger/request_handler.rb +2 -2
  443. data/src/ruby_supportlib/phusion_passenger/request_handler/thread_handler.rb +5 -0
  444. data/src/ruby_supportlib/phusion_passenger/standalone/config_options_list.rb +11 -0
  445. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/builtin_engine.rb +3 -0
  446. data/src/ruby_supportlib/phusion_passenger/standalone/start_command/nginx_engine.rb +1 -1
  447. data/src/ruby_supportlib/phusion_passenger/utils/tee_input.rb +6 -0
  448. data/src/ruby_supportlib/phusion_passenger/utils/unseekable_socket.rb +15 -11
  449. metadata +42 -8
  450. data/src/cxx_supportlib/vendor-modified/boost/call_traits.hpp +0 -20
  451. data/src/cxx_supportlib/vendor-modified/boost/detail/call_traits.hpp +0 -172
  452. data/src/cxx_supportlib/vendor-modified/boost/detail/no_exceptions_support.hpp +0 -17
  453. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_code.ipp +0 -496
@@ -0,0 +1,367 @@
1
+ /* boost random/faure.hpp header file
2
+ *
3
+ * Copyright Justinas Vygintas Daugmaudis 2010-2018
4
+ * Distributed under the Boost Software License, Version 1.0. (See
5
+ * accompanying file LICENSE_1_0.txt or copy at
6
+ * http://www.boost.org/LICENSE_1_0.txt)
7
+ */
8
+
9
+ #ifndef BOOST_RANDOM_FAURE_HPP
10
+ #define BOOST_RANDOM_FAURE_HPP
11
+
12
+ #include <boost/random/detail/qrng_base.hpp>
13
+
14
+ #include <cmath>
15
+ #include <vector>
16
+ #include <algorithm>
17
+
18
+ #include <boost/assert.hpp>
19
+
20
+ namespace boost {
21
+ namespace random {
22
+
23
+ /** @cond */
24
+ namespace detail {
25
+
26
+ namespace qrng_tables {
27
+
28
+ // There is no particular reason why 187 first primes were chosen
29
+ // to be put into this table. The only reason was, perhaps, that
30
+ // the number of dimensions for Faure generator would be around
31
+ // the same order of magnitude as the number of dimensions supported
32
+ // by the Sobol qrng.
33
+ struct primes
34
+ {
35
+ typedef unsigned short value_type;
36
+
37
+ BOOST_STATIC_CONSTANT(int, number_of_primes = 187);
38
+
39
+ // A function that returns lower bound prime for a given n
40
+ static value_type lower_bound(std::size_t n)
41
+ {
42
+ static const value_type prim_a[number_of_primes] = {
43
+ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,
44
+ 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113,
45
+ 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181,
46
+ 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251,
47
+ 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317,
48
+ 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397,
49
+ 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463,
50
+ 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557,
51
+ 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619,
52
+ 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701,
53
+ 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787,
54
+ 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
55
+ 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953,
56
+ 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031,
57
+ 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093,
58
+ 1097, 1103, 1109, 1117 };
59
+
60
+ qrng_detail::dimension_assert("Faure", n, prim_a[number_of_primes - 1]);
61
+
62
+ return *std::lower_bound(prim_a, prim_a + number_of_primes, n);
63
+ }
64
+ };
65
+
66
+ } // namespace qrng_tables
67
+ } // namespace detail
68
+
69
+ namespace qrng_detail {
70
+ namespace fr {
71
+
72
+ // Returns the integer part of the logarithm base Base of arg.
73
+ // In erroneous situations, e.g., integer_log(base, 0) the function
74
+ // returns 0 and does not report the error. This is the intended
75
+ // behavior.
76
+ template <typename T>
77
+ inline T integer_log(T base, T arg)
78
+ {
79
+ T ilog = T();
80
+ while (base <= arg)
81
+ {
82
+ arg /= base; ++ilog;
83
+ }
84
+ return ilog;
85
+ }
86
+
87
+ // Perform exponentiation by squaring (potential for code reuse in multiprecision::powm)
88
+ template <typename T>
89
+ inline T integer_pow(T base, T e)
90
+ {
91
+ T result = static_cast<T>(1);
92
+ while (e)
93
+ {
94
+ if (e & static_cast<T>(1))
95
+ result *= base;
96
+ e >>= 1;
97
+ base *= base;
98
+ }
99
+ return result;
100
+ }
101
+
102
+ } // namespace fr
103
+
104
+ // Computes a table of binomial coefficients modulo qs.
105
+ template<typename RealType, typename SeqSizeT, typename PrimeTable>
106
+ struct binomial_coefficients
107
+ {
108
+ typedef RealType value_type;
109
+ typedef SeqSizeT size_type;
110
+
111
+ // Binomial values modulo qs_base will never be bigger than qs_base.
112
+ // We can choose an appropriate integer type to hold modulo values and
113
+ // shave off memory footprint.
114
+ typedef typename PrimeTable::value_type packed_uint_t;
115
+
116
+ // default copy c-tor is fine
117
+
118
+ explicit binomial_coefficients(std::size_t dimension)
119
+ {
120
+ resize(dimension);
121
+ }
122
+
123
+ void resize(std::size_t dimension)
124
+ {
125
+ qs_base = PrimeTable::lower_bound(dimension);
126
+
127
+ // Throw away previously computed coefficients.
128
+ // This will trigger recomputation on next update
129
+ coeff.clear();
130
+ }
131
+
132
+ template <typename Iterator>
133
+ void update(size_type seq, Iterator first, Iterator last)
134
+ {
135
+ if (first != last)
136
+ {
137
+ const size_type ilog = fr::integer_log(static_cast<size_type>(qs_base), seq);
138
+ const size_type hisum = ilog + 1;
139
+ if (coeff.size() != size_hint(hisum)) {
140
+ ytemp.resize(static_cast<std::size_t>(hisum)); // cast safe because log is small
141
+ compute_coefficients(hisum);
142
+ qs_pow = fr::integer_pow(static_cast<size_type>(qs_base), ilog);
143
+ }
144
+
145
+ *first = compute_recip(seq, ytemp.rbegin());
146
+
147
+ // Find other components using the Faure method.
148
+ ++first;
149
+ for ( ; first != last; ++first)
150
+ {
151
+ *first = RealType();
152
+ RealType r = static_cast<RealType>(1);
153
+
154
+ for (size_type i = 0; i != hisum; ++i)
155
+ {
156
+ RealType ztemp = ytemp[static_cast<std::size_t>(i)] * upper_element(i, i, hisum);
157
+ for (size_type j = i + 1; j != hisum; ++j)
158
+ ztemp += ytemp[static_cast<std::size_t>(j)] * upper_element(i, j, hisum);
159
+
160
+ // Sum ( J <= I <= HISUM ) ( old ytemp(i) * binom(i,j) ) mod QS.
161
+ ytemp[static_cast<std::size_t>(i)] = std::fmod(ztemp, static_cast<RealType>(qs_base));
162
+ r *= static_cast<RealType>(qs_base);
163
+ *first += ytemp[static_cast<std::size_t>(i)] / r;
164
+ }
165
+ }
166
+ }
167
+ }
168
+
169
+ private:
170
+ inline static size_type size_hint(size_type n)
171
+ {
172
+ return n * (n + 1) / 2;
173
+ }
174
+
175
+ packed_uint_t& upper_element(size_type i, size_type j, size_type dim)
176
+ {
177
+ BOOST_ASSERT( i < dim );
178
+ BOOST_ASSERT( j < dim );
179
+ BOOST_ASSERT( i <= j );
180
+ return coeff[static_cast<std::size_t>((i * (2 * dim - i + 1)) / 2 + j - i)];
181
+ }
182
+
183
+ template<typename Iterator>
184
+ RealType compute_recip(size_type seq, Iterator out) const
185
+ {
186
+ // Here we do
187
+ // Sum ( 0 <= J <= HISUM ) YTEMP(J) * QS**J
188
+ // Sum ( 0 <= J <= HISUM ) YTEMP(J) / QS**(J+1)
189
+ // in one go
190
+ RealType r = RealType();
191
+ size_type m, k = qs_pow;
192
+ for( ; k != 0; ++out, seq = m, k /= qs_base )
193
+ {
194
+ m = seq % k;
195
+ RealType v = static_cast<RealType>((seq - m) / k); // RealType <- size type
196
+ r += v;
197
+ r /= static_cast<RealType>(qs_base);
198
+ *out = v; // saves double dereference
199
+ }
200
+ return r;
201
+ }
202
+
203
+ void compute_coefficients(const size_type n)
204
+ {
205
+ // Resize and initialize to zero
206
+ coeff.resize(static_cast<std::size_t>(size_hint(n)));
207
+ std::fill(coeff.begin(), coeff.end(), packed_uint_t());
208
+
209
+ // The first row and the diagonal is assigned to 1
210
+ upper_element(0, 0, n) = 1;
211
+ for (size_type i = 1; i < n; ++i)
212
+ {
213
+ upper_element(0, i, n) = 1;
214
+ upper_element(i, i, n) = 1;
215
+ }
216
+
217
+ // Computes binomial coefficients MOD qs_base
218
+ for (size_type i = 1; i < n; ++i)
219
+ {
220
+ for (size_type j = i + 1; j < n; ++j)
221
+ {
222
+ upper_element(i, j, n) = ( upper_element(i, j-1, n) +
223
+ upper_element(i-1, j-1, n) ) % qs_base;
224
+ }
225
+ }
226
+ }
227
+
228
+ private:
229
+ packed_uint_t qs_base;
230
+
231
+ // here we cache precomputed data; note that binomial coefficients have
232
+ // to be recomputed iff the integer part of the logarithm of seq changes,
233
+ // which happens relatively rarely.
234
+ std::vector<packed_uint_t> coeff; // packed upper (!) triangular matrix
235
+ std::vector<RealType> ytemp;
236
+ size_type qs_pow;
237
+ };
238
+
239
+ } // namespace qrng_detail
240
+
241
+ typedef detail::qrng_tables::primes default_faure_prime_table;
242
+
243
+ /** @endcond */
244
+
245
+ //!Instantiations of class template faure_engine model a \quasi_random_number_generator.
246
+ //!The faure_engine uses the algorithm described in
247
+ //! \blockquote
248
+ //!Henri Faure,
249
+ //!Discrepance de suites associees a un systeme de numeration (en dimension s),
250
+ //!Acta Arithmetica,
251
+ //!Volume 41, 1982, pages 337-351.
252
+ //! \endblockquote
253
+ //
254
+ //! \blockquote
255
+ //!Bennett Fox,
256
+ //!Algorithm 647:
257
+ //!Implementation and Relative Efficiency of Quasirandom
258
+ //!Sequence Generators,
259
+ //!ACM Transactions on Mathematical Software,
260
+ //!Volume 12, Number 4, December 1986, pages 362-376.
261
+ //! \endblockquote
262
+ //!
263
+ //!In the following documentation @c X denotes the concrete class of the template
264
+ //!faure_engine returning objects of type @c RealType, u and v are the values of @c X.
265
+ //!
266
+ //!Some member functions may throw exceptions of type @c std::bad_alloc.
267
+ template<typename RealType, typename SeqSizeT, typename PrimeTable = default_faure_prime_table>
268
+ class faure_engine
269
+ : public qrng_detail::qrng_base<
270
+ faure_engine<RealType, SeqSizeT, PrimeTable>
271
+ , qrng_detail::binomial_coefficients<RealType, SeqSizeT, PrimeTable>
272
+ , SeqSizeT
273
+ >
274
+ {
275
+ typedef faure_engine<RealType, SeqSizeT, PrimeTable> self_t;
276
+
277
+ typedef qrng_detail::binomial_coefficients<RealType, SeqSizeT, PrimeTable> lattice_t;
278
+ typedef qrng_detail::qrng_base<self_t, lattice_t, SeqSizeT> base_t;
279
+
280
+ friend class qrng_detail::qrng_base<self_t, lattice_t, SeqSizeT>;
281
+
282
+ public:
283
+ typedef RealType result_type;
284
+
285
+ /** @copydoc boost::random::niederreiter_base2_engine::min() */
286
+ static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
287
+ { return static_cast<result_type>(0); }
288
+
289
+ /** @copydoc boost::random::niederreiter_base2_engine::max() */
290
+ static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
291
+ { return static_cast<result_type>(1); }
292
+
293
+ //!Effects: Constructs the `s`-dimensional default Faure quasi-random number generator.
294
+ //!
295
+ //!Throws: bad_alloc, invalid_argument.
296
+ explicit faure_engine(std::size_t s)
297
+ : base_t(s) // initialize the binomial table here
298
+ {}
299
+
300
+ /** @copydetails boost::random::niederreiter_base2_engine::seed(UIntType)
301
+ * Throws: bad_alloc.
302
+ */
303
+ void seed(SeqSizeT init = 0)
304
+ {
305
+ compute_seq(init);
306
+ base_t::reset_seq(init);
307
+ }
308
+
309
+ #ifdef BOOST_RANDOM_DOXYGEN
310
+ //=========================Doxygen needs this!==============================
311
+
312
+ /** @copydoc boost::random::niederreiter_base2_engine::dimension() */
313
+ std::size_t dimension() const { return base_t::dimension(); }
314
+
315
+ /** @copydoc boost::random::niederreiter_base2_engine::operator()() */
316
+ result_type operator()()
317
+ {
318
+ return base_t::operator()();
319
+ }
320
+
321
+ /** @copydoc boost::random::niederreiter_base2_engine::discard(boost::uintmax_t)
322
+ * Throws: bad_alloc.
323
+ */
324
+ void discard(boost::uintmax_t z)
325
+ {
326
+ base_t::discard(z);
327
+ }
328
+
329
+ /** Returns true if the two generators will produce identical sequences of outputs. */
330
+ BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(faure_engine, x, y)
331
+ { return static_cast<const base_t&>(x) == y; }
332
+
333
+ /** Returns true if the two generators will produce different sequences of outputs. */
334
+ BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(faure_engine)
335
+
336
+ /** Writes the textual representation of the generator to a @c std::ostream. */
337
+ BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, faure_engine, s)
338
+ { return os << static_cast<const base_t&>(s); }
339
+
340
+ /** Reads the textual representation of the generator from a @c std::istream. */
341
+ BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, faure_engine, s)
342
+ { return is >> static_cast<base_t&>(s); }
343
+
344
+ #endif // BOOST_RANDOM_DOXYGEN
345
+
346
+ private:
347
+ /** @cond hide_private_members */
348
+ void compute_seq(SeqSizeT seq)
349
+ {
350
+ qrng_detail::check_seed_sign(seq);
351
+ this->lattice.update(seq, this->state_begin(), this->state_end());
352
+ }
353
+ /** @endcond */
354
+ };
355
+
356
+ /**
357
+ * @attention This specialization of \faure_engine supports up to 1117 dimensions.
358
+ *
359
+ * However, it is possible to provide your own prime table to \faure_engine should the default one be insufficient.
360
+ */
361
+ typedef faure_engine<double, boost::uint_least64_t, default_faure_prime_table> faure;
362
+
363
+ } // namespace random
364
+
365
+ } // namespace boost
366
+
367
+ #endif // BOOST_RANDOM_FAURE_HPP
@@ -0,0 +1,360 @@
1
+ /* boost random/nierderreiter_base2.hpp header file
2
+ *
3
+ * Copyright Justinas Vygintas Daugmaudis 2010-2018
4
+ * Distributed under the Boost Software License, Version 1.0. (See
5
+ * accompanying file LICENSE_1_0.txt or copy at
6
+ * http://www.boost.org/LICENSE_1_0.txt)
7
+ */
8
+
9
+ #ifndef BOOST_RANDOM_NIEDERREITER_BASE2_HPP
10
+ #define BOOST_RANDOM_NIEDERREITER_BASE2_HPP
11
+
12
+ #include <boost/random/detail/niederreiter_base2_table.hpp>
13
+ #include <boost/random/detail/gray_coded_qrng.hpp>
14
+
15
+ #include <boost/dynamic_bitset.hpp>
16
+
17
+ namespace boost {
18
+ namespace random {
19
+
20
+ /** @cond */
21
+ namespace qrng_detail {
22
+ namespace nb2 {
23
+
24
+ // Return the base 2 logarithm for a given bitset v
25
+ template <typename DynamicBitset>
26
+ inline typename DynamicBitset::size_type
27
+ bitset_log2(const DynamicBitset& v)
28
+ {
29
+ if (v.none())
30
+ boost::throw_exception( std::invalid_argument("bitset_log2") );
31
+
32
+ typename DynamicBitset::size_type hibit = v.size() - 1;
33
+ while (!v.test(hibit))
34
+ --hibit;
35
+ return hibit;
36
+ }
37
+
38
+
39
+ // Multiply polynomials over Z_2.
40
+ template <typename PolynomialT, typename DynamicBitset>
41
+ inline void modulo2_multiply(PolynomialT P, DynamicBitset& v, DynamicBitset& pt)
42
+ {
43
+ pt.reset(); // pt == 0
44
+ for (; P; P >>= 1, v <<= 1)
45
+ if (P & 1) pt ^= v;
46
+ pt.swap(v);
47
+ }
48
+
49
+
50
+ // Calculate the values of the constants V(J,R) as
51
+ // described in BFN section 3.3.
52
+ //
53
+ // pb = polynomial defined in section 2.3 of BFN.
54
+ template <typename DynamicBitset>
55
+ inline void calculate_v(const DynamicBitset& pb,
56
+ typename DynamicBitset::size_type kj,
57
+ typename DynamicBitset::size_type pb_degree,
58
+ DynamicBitset& v)
59
+ {
60
+ typedef typename DynamicBitset::size_type size_type;
61
+
62
+ // Now choose values of V in accordance with
63
+ // the conditions in section 3.3.
64
+ size_type r = 0;
65
+ for ( ; r != kj; ++r)
66
+ v.reset(r);
67
+
68
+ // Quoting from BFN: "Our program currently sets each K_q
69
+ // equal to eq. This has the effect of setting all unrestricted
70
+ // values of v to 1."
71
+ for ( ; r < pb_degree; ++r)
72
+ v.set(r);
73
+
74
+ // Calculate the remaining V's using the recursion of section 2.3,
75
+ // remembering that the B's have the opposite sign.
76
+ for ( ; r != v.size(); ++r)
77
+ {
78
+ bool term = false;
79
+ for (typename DynamicBitset::size_type k = 0; k < pb_degree; ++k)
80
+ {
81
+ term ^= pb.test(k) & v[r + k - pb_degree];
82
+ }
83
+ v[r] = term;
84
+ }
85
+ }
86
+
87
+ } // namespace nb2
88
+
89
+ template<typename UIntType, unsigned w, typename Nb2Table>
90
+ struct niederreiter_base2_lattice
91
+ {
92
+ typedef UIntType value_type;
93
+
94
+ BOOST_STATIC_ASSERT(w > 0u);
95
+ BOOST_STATIC_CONSTANT(unsigned, bit_count = w);
96
+
97
+ private:
98
+ typedef std::vector<value_type> container_type;
99
+
100
+ public:
101
+ explicit niederreiter_base2_lattice(std::size_t dimension)
102
+ {
103
+ resize(dimension);
104
+ }
105
+
106
+ void resize(std::size_t dimension)
107
+ {
108
+ typedef boost::dynamic_bitset<> bitset_type;
109
+
110
+ dimension_assert("Niederreiter base 2", dimension, Nb2Table::max_dimension);
111
+
112
+ // Initialize the bit array
113
+ container_type cj(bit_count * dimension);
114
+
115
+ // Reserve temporary space for lattice computation
116
+ bitset_type v, pb, tmp;
117
+
118
+ // Compute Niedderreiter base 2 lattice
119
+ for (std::size_t dim = 0; dim != dimension; ++dim)
120
+ {
121
+ const typename Nb2Table::value_type poly = Nb2Table::polynomial(dim);
122
+ if (poly > std::numeric_limits<value_type>::max()) {
123
+ boost::throw_exception( std::range_error("niederreiter_base2: polynomial value outside the given value type range") );
124
+ }
125
+
126
+ const unsigned degree = multiprecision::msb(poly); // integer log2(poly)
127
+ const unsigned space_required = degree * ((bit_count / degree) + 1); // ~ degree + bit_count
128
+
129
+ v.resize(degree + bit_count - 1);
130
+
131
+ // For each dimension, we need to calculate powers of an
132
+ // appropriate irreducible polynomial, see Niederreiter
133
+ // page 65, just below equation (19).
134
+ // Copy the appropriate irreducible polynomial into PX,
135
+ // and its degree into E. Set polynomial B = PX ** 0 = 1.
136
+ // M is the degree of B. Subsequently B will hold higher
137
+ // powers of PX.
138
+ pb.resize(space_required); tmp.resize(space_required);
139
+
140
+ typename bitset_type::size_type kj, pb_degree = 0;
141
+ pb.reset(); // pb == 0
142
+ pb.set(pb_degree); // set the proper bit for the pb_degree
143
+
144
+ value_type j = high_bit_mask_t<bit_count - 1>::high_bit;
145
+ do
146
+ {
147
+ // Now choose a value of Kj as defined in section 3.3.
148
+ // We must have 0 <= Kj < E*J = M.
149
+ // The limit condition on Kj does not seem to be very relevant
150
+ // in this program.
151
+ kj = pb_degree;
152
+
153
+ // Now multiply B by PX so B becomes PX**J.
154
+ // In section 2.3, the values of Bi are defined with a minus sign :
155
+ // don't forget this if you use them later!
156
+ nb2::modulo2_multiply(poly, pb, tmp);
157
+ pb_degree += degree;
158
+ if (pb_degree >= pb.size()) {
159
+ // Note that it is quite possible for kj to become bigger than
160
+ // the new computed value of pb_degree.
161
+ pb_degree = nb2::bitset_log2(pb);
162
+ }
163
+
164
+ // If U = 0, we need to set B to the next power of PX
165
+ // and recalculate V.
166
+ nb2::calculate_v(pb, kj, pb_degree, v);
167
+
168
+ // Niederreiter (page 56, after equation (7), defines two
169
+ // variables Q and U. We do not need Q explicitly, but we
170
+ // do need U.
171
+
172
+ // Advance Niederreiter's state variables.
173
+ for (unsigned u = 0; j && u != degree; ++u, j >>= 1)
174
+ {
175
+ // Now C is obtained from V. Niederreiter
176
+ // obtains A from V (page 65, near the bottom), and then gets
177
+ // C from A (page 56, equation (7)). However this can be done
178
+ // in one step. Here CI(J,R) corresponds to
179
+ // Niederreiter's C(I,J,R), whose values we pack into array
180
+ // CJ so that CJ(I,R) holds all the values of C(I,J,R) for J from 1 to NBITS.
181
+ for (unsigned r = 0; r != bit_count; ++r) {
182
+ value_type& num = cj[dimension * r + dim];
183
+ // set the jth bit in num
184
+ num = (num & ~j) | (-v[r + u] & j);
185
+ }
186
+ }
187
+ } while (j != 0);
188
+ }
189
+
190
+ bits.swap(cj);
191
+ }
192
+
193
+ typename container_type::const_iterator iter_at(std::size_t n) const
194
+ {
195
+ BOOST_ASSERT(!(n > bits.size()));
196
+ return bits.begin() + n;
197
+ }
198
+
199
+ private:
200
+ container_type bits;
201
+ };
202
+
203
+ } // namespace qrng_detail
204
+
205
+ typedef detail::qrng_tables::niederreiter_base2 default_niederreiter_base2_table;
206
+
207
+ /** @endcond */
208
+
209
+ //!Instantiations of class template niederreiter_base2_engine model a \quasi_random_number_generator.
210
+ //!The niederreiter_base2_engine uses the algorithm described in
211
+ //! \blockquote
212
+ //!Bratley, Fox, Niederreiter, ACM Trans. Model. Comp. Sim. 2, 195 (1992).
213
+ //! \endblockquote
214
+ //!
215
+ //!\attention niederreiter_base2_engine skips trivial zeroes at the start of the sequence. For example,
216
+ //!the beginning of the 2-dimensional Niederreiter base 2 sequence in @c uniform_01 distribution will look
217
+ //!like this:
218
+ //!\code{.cpp}
219
+ //!0.5, 0.5,
220
+ //!0.75, 0.25,
221
+ //!0.25, 0.75,
222
+ //!0.375, 0.375,
223
+ //!0.875, 0.875,
224
+ //!...
225
+ //!\endcode
226
+ //!
227
+ //!In the following documentation @c X denotes the concrete class of the template
228
+ //!niederreiter_base2_engine returning objects of type @c UIntType, u and v are the values of @c X.
229
+ //!
230
+ //!Some member functions may throw exceptions of type std::range_error. This
231
+ //!happens when the quasi-random domain is exhausted and the generator cannot produce
232
+ //!any more values. The length of the low discrepancy sequence is given by
233
+ //! \f$L=Dimension \times (2^{w} - 1)\f$.
234
+ template<typename UIntType, unsigned w, typename Nb2Table = default_niederreiter_base2_table>
235
+ class niederreiter_base2_engine
236
+ : public qrng_detail::gray_coded_qrng<
237
+ qrng_detail::niederreiter_base2_lattice<UIntType, w, Nb2Table>
238
+ >
239
+ {
240
+ typedef qrng_detail::niederreiter_base2_lattice<UIntType, w, Nb2Table> lattice_t;
241
+ typedef qrng_detail::gray_coded_qrng<lattice_t> base_t;
242
+
243
+ public:
244
+ //!Effects: Constructs the default `s`-dimensional Niederreiter base 2 quasi-random number generator.
245
+ //!
246
+ //!Throws: bad_alloc, invalid_argument, range_error.
247
+ explicit niederreiter_base2_engine(std::size_t s)
248
+ : base_t(s) // initialize lattice here
249
+ {}
250
+
251
+ #ifdef BOOST_RANDOM_DOXYGEN
252
+ //=========================Doxygen needs this!==============================
253
+ typedef UIntType result_type;
254
+
255
+ //!Returns: Tight lower bound on the set of values returned by operator().
256
+ //!
257
+ //!Throws: nothing.
258
+ static BOOST_CONSTEXPR result_type min BOOST_PREVENT_MACRO_SUBSTITUTION ()
259
+ { return (base_t::min)(); }
260
+
261
+ //!Returns: Tight upper bound on the set of values returned by operator().
262
+ //!
263
+ //!Throws: nothing.
264
+ static BOOST_CONSTEXPR result_type max BOOST_PREVENT_MACRO_SUBSTITUTION ()
265
+ { return (base_t::max)(); }
266
+
267
+ //!Returns: The dimension of of the quasi-random domain.
268
+ //!
269
+ //!Throws: nothing.
270
+ std::size_t dimension() const { return base_t::dimension(); }
271
+
272
+ //!Effects: Resets the quasi-random number generator state to
273
+ //!the one given by the default construction. Equivalent to u.seed(0).
274
+ //!
275
+ //!\brief Throws: nothing.
276
+ void seed()
277
+ {
278
+ base_t::seed();
279
+ }
280
+
281
+ //!Effects: Effectively sets the quasi-random number generator state to the `init`-th
282
+ //!vector in the `s`-dimensional quasi-random domain, where `s` == X::dimension().
283
+ //!\code
284
+ //!X u, v;
285
+ //!for(int i = 0; i < N; ++i)
286
+ //! for( std::size_t j = 0; j < u.dimension(); ++j )
287
+ //! u();
288
+ //!v.seed(N);
289
+ //!assert(u() == v());
290
+ //!\endcode
291
+ //!
292
+ //!\brief Throws: range_error.
293
+ void seed(UIntType init)
294
+ {
295
+ base_t::seed(init);
296
+ }
297
+
298
+ //!Returns: Returns a successive element of an `s`-dimensional
299
+ //!(s = X::dimension()) vector at each invocation. When all elements are
300
+ //!exhausted, X::operator() begins anew with the starting element of a
301
+ //!subsequent `s`-dimensional vector.
302
+ //!
303
+ //!Throws: range_error.
304
+ result_type operator()()
305
+ {
306
+ return base_t::operator()();
307
+ }
308
+
309
+ //!Effects: Advances *this state as if `z` consecutive
310
+ //!X::operator() invocations were executed.
311
+ //!\code
312
+ //!X u = v;
313
+ //!for(int i = 0; i < N; ++i)
314
+ //! u();
315
+ //!v.discard(N);
316
+ //!assert(u() == v());
317
+ //!\endcode
318
+ //!
319
+ //!Throws: range_error.
320
+ void discard(boost::uintmax_t z)
321
+ {
322
+ base_t::discard(z);
323
+ }
324
+
325
+ //!Returns true if the two generators will produce identical sequences of outputs.
326
+ BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(niederreiter_base2_engine, x, y)
327
+ { return static_cast<const base_t&>(x) == y; }
328
+
329
+ //!Returns true if the two generators will produce different sequences of outputs.
330
+ BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(niederreiter_base2_engine)
331
+
332
+ //!Writes the textual representation of the generator to a @c std::ostream.
333
+ BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, niederreiter_base2_engine, s)
334
+ { return os << static_cast<const base_t&>(s); }
335
+
336
+ //!Reads the textual representation of the generator from a @c std::istream.
337
+ BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, niederreiter_base2_engine, s)
338
+ { return is >> static_cast<base_t&>(s); }
339
+
340
+ #endif // BOOST_RANDOM_DOXYGEN
341
+ };
342
+
343
+
344
+ /**
345
+ * @attention This specialization of \niederreiter_base2_engine supports up to 4720 dimensions.
346
+ *
347
+ * Binary irreducible polynomials (primes in the ring `GF(2)[X]`, evaluated at `X=2`) were generated
348
+ * while condition `max(prime)` < 2<sup>16</sup> was satisfied.
349
+ *
350
+ * There are exactly 4720 such primes, which yields a Niederreiter base 2 table for 4720 dimensions.
351
+ *
352
+ * However, it is possible to provide your own table to \niederreiter_base2_engine should the default one be insufficient.
353
+ */
354
+ typedef niederreiter_base2_engine<boost::uint_least64_t, 64u, default_niederreiter_base2_table> niederreiter_base2;
355
+
356
+ } // namespace random
357
+
358
+ } // namespace boost
359
+
360
+ #endif // BOOST_RANDOM_NIEDERREITER_BASE2_HPP