passenger 6.0.1 → 6.0.6

Sign up to get free protection for your applications and to get access to all the features.
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