passenger 3.0.21 → 3.9.1.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (835) hide show
  1. data/DEVELOPERS.TXT +4 -10
  2. data/NEWS +19 -27
  3. data/Rakefile +20 -19
  4. data/bin/passenger +3 -2
  5. data/bin/passenger-config +35 -5
  6. data/bin/passenger-install-apache2-module +12 -12
  7. data/bin/passenger-install-nginx-module +55 -38
  8. data/bin/passenger-memory-stats +3 -1
  9. data/bin/passenger-status +7 -35
  10. data/build/agents.rb +107 -21
  11. data/build/apache2.rb +11 -46
  12. data/build/basics.rb +61 -9
  13. data/build/common_library.rb +59 -142
  14. data/build/cxx_tests.rb +111 -110
  15. data/build/documentation.rb +33 -0
  16. data/build/misc.rb +30 -12
  17. data/build/nginx.rb +10 -39
  18. data/build/oxt_tests.rb +1 -0
  19. data/build/ruby_extension.rb +1 -5
  20. data/build/test_basics.rb +3 -2
  21. data/dev/copy_boost_headers.rb +2 -1
  22. data/doc/Architectural overview.html +49 -90
  23. data/doc/DebuggingAndStressTesting.txt.md +49 -0
  24. data/doc/Packaging.txt.md +254 -0
  25. data/doc/Security of user switching support.html +35 -66
  26. data/doc/Users guide Apache.html +588 -758
  27. data/doc/Users guide Apache.idmap.txt +253 -136
  28. data/doc/Users guide Apache.txt +154 -109
  29. data/doc/Users guide Nginx.html +544 -660
  30. data/doc/Users guide Nginx.idmap.txt +179 -91
  31. data/doc/Users guide Nginx.txt +192 -118
  32. data/doc/Users guide Standalone.html +65 -48
  33. data/doc/Users guide Standalone.idmap.txt +10 -2
  34. data/doc/Users guide Standalone.txt +4 -0
  35. data/doc/images/glyphicons-halflings-white.png +0 -0
  36. data/doc/images/glyphicons-halflings.png +0 -0
  37. data/doc/images/phusion_banner_small.png +0 -0
  38. data/doc/images/{smart-lv2.png → smart.png} +0 -0
  39. data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
  40. data/doc/templates/bootstrap.min.css +397 -0
  41. data/doc/templates/markdown.html.erb +117 -0
  42. data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
  43. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
  44. data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
  45. data/doc/users_guide_snippets/support_information.txt +30 -0
  46. data/ext/apache2/Bucket.cpp +9 -26
  47. data/ext/apache2/Bucket.h +13 -10
  48. data/ext/apache2/Configuration.cpp +70 -58
  49. data/ext/apache2/Configuration.hpp +19 -47
  50. data/ext/apache2/DirectoryMapper.h +7 -7
  51. data/ext/apache2/Hooks.cpp +150 -313
  52. data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
  53. data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
  54. data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
  55. data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
  56. data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
  57. data/ext/boost/algorithm/string/formatter.hpp +20 -3
  58. data/ext/boost/assert.hpp +85 -4
  59. data/ext/boost/bind/bind.hpp +1 -1
  60. data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
  61. data/ext/boost/concept_check.hpp +140 -64
  62. data/ext/boost/config.hpp +1 -1
  63. data/ext/boost/config/auto_link.hpp +8 -6
  64. data/ext/boost/config/compiler/borland.hpp +12 -2
  65. data/ext/boost/config/compiler/clang.hpp +89 -30
  66. data/ext/boost/config/compiler/codegear.hpp +3 -2
  67. data/ext/boost/config/compiler/common_edg.hpp +7 -5
  68. data/ext/boost/config/compiler/cray.hpp +61 -0
  69. data/ext/boost/config/compiler/digitalmars.hpp +9 -1
  70. data/ext/boost/config/compiler/gcc.hpp +33 -24
  71. data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
  72. data/ext/boost/config/compiler/hp_acc.hpp +12 -1
  73. data/ext/boost/config/compiler/intel.hpp +78 -4
  74. data/ext/boost/config/compiler/metrowerks.hpp +4 -1
  75. data/ext/boost/config/compiler/mpw.hpp +4 -1
  76. data/ext/boost/config/compiler/nvcc.hpp +8 -66
  77. data/ext/boost/config/compiler/pathscale.hpp +80 -0
  78. data/ext/boost/config/compiler/pgi.hpp +5 -5
  79. data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
  80. data/ext/boost/config/compiler/vacpp.hpp +37 -13
  81. data/ext/boost/config/compiler/visualc.hpp +24 -11
  82. data/ext/boost/config/platform/bsd.hpp +1 -1
  83. data/ext/boost/config/platform/cray.hpp +18 -0
  84. data/ext/boost/config/platform/cygwin.hpp +10 -0
  85. data/ext/boost/config/platform/linux.hpp +5 -0
  86. data/ext/boost/config/platform/macos.hpp +5 -4
  87. data/ext/boost/config/platform/symbian.hpp +5 -2
  88. data/ext/boost/config/platform/vms.hpp +25 -0
  89. data/ext/boost/config/platform/win32.hpp +7 -1
  90. data/ext/boost/config/select_compiler_config.hpp +8 -25
  91. data/ext/boost/config/select_platform_config.hpp +8 -1
  92. data/ext/boost/config/select_stdlib_config.hpp +9 -1
  93. data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
  94. data/ext/boost/config/stdlib/libcomo.hpp +1 -4
  95. data/ext/boost/config/stdlib/libcpp.hpp +36 -0
  96. data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
  97. data/ext/boost/config/stdlib/modena.hpp +1 -4
  98. data/ext/boost/config/stdlib/msl.hpp +1 -4
  99. data/ext/boost/config/stdlib/roguewave.hpp +9 -6
  100. data/ext/boost/config/stdlib/sgi.hpp +12 -4
  101. data/ext/boost/config/stdlib/stlport.hpp +11 -4
  102. data/ext/boost/config/stdlib/vacpp.hpp +11 -4
  103. data/ext/boost/config/suffix.hpp +71 -6
  104. data/ext/boost/config/warning_disable.hpp +1 -1
  105. data/ext/boost/container/container_fwd.hpp +177 -0
  106. data/ext/boost/cstdint.hpp +17 -12
  107. data/ext/boost/current_function.hpp +2 -1
  108. data/ext/boost/date_time/c_time.hpp +17 -1
  109. data/ext/boost/date_time/compiler_config.hpp +13 -15
  110. data/ext/boost/date_time/date_formatting.hpp +7 -1
  111. data/ext/boost/date_time/filetime_functions.hpp +4 -4
  112. data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
  113. data/ext/boost/date_time/strings_from_facet.hpp +3 -3
  114. data/ext/boost/date_time/time_facet.hpp +101 -101
  115. data/ext/boost/detail/endian.hpp +4 -2
  116. data/ext/boost/detail/fenv.hpp +74 -0
  117. data/ext/boost/detail/sp_typeinfo.hpp +6 -0
  118. data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
  119. data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
  120. data/ext/boost/exception/detail/type_info.hpp +3 -3
  121. data/ext/boost/exception/diagnostic_information.hpp +37 -21
  122. data/ext/boost/exception/exception.hpp +21 -1
  123. data/ext/boost/exception/info.hpp +0 -1
  124. data/ext/boost/function.hpp +2 -2
  125. data/ext/boost/function/function_base.hpp +15 -9
  126. data/ext/boost/function/function_template.hpp +26 -48
  127. data/ext/boost/integer_fwd.hpp +0 -16
  128. data/ext/boost/integer_traits.hpp +2 -2
  129. data/ext/boost/iterator.hpp +1 -1
  130. data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
  131. data/ext/boost/iterator/iterator_facade.hpp +13 -13
  132. data/ext/boost/iterator/transform_iterator.hpp +5 -20
  133. data/ext/boost/lexical_cast.hpp +1655 -673
  134. data/ext/boost/math/policies/policy.hpp +982 -0
  135. data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
  136. data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
  137. data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
  138. data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
  139. data/ext/boost/math/special_functions/sign.hpp +145 -0
  140. data/ext/boost/math/tools/config.hpp +321 -0
  141. data/ext/boost/math/tools/promotion.hpp +150 -0
  142. data/ext/boost/math/tools/real_cast.hpp +29 -0
  143. data/ext/boost/math/tools/user.hpp +97 -0
  144. data/ext/boost/move/move.hpp +1222 -0
  145. data/ext/boost/mpl/O1_size.hpp +40 -0
  146. data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
  147. data/ext/boost/mpl/advance.hpp +76 -0
  148. data/ext/boost/mpl/advance_fwd.hpp +28 -0
  149. data/ext/boost/mpl/at.hpp +52 -0
  150. data/ext/boost/mpl/at_fwd.hpp +24 -0
  151. data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
  152. data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
  153. data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
  154. data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
  155. data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
  156. data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
  157. data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
  158. data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
  159. data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
  160. data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
  161. data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
  162. data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
  163. data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
  164. data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
  165. data/ext/boost/mpl/aux_/has_size.hpp +23 -0
  166. data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
  167. data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
  168. data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
  169. data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
  170. data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
  171. data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
  172. data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
  173. data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
  174. data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
  175. data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
  176. data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
  177. data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
  178. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
  179. data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
  180. data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
  181. data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
  182. data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
  183. data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
  184. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
  185. data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
  186. data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
  187. data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
  188. data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
  189. data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
  190. data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
  191. data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
  192. data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
  193. data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
  194. data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
  195. data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
  196. data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
  197. data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
  198. data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
  199. data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
  200. data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
  201. data/ext/boost/mpl/back_fwd.hpp +24 -0
  202. data/ext/boost/mpl/back_inserter.hpp +34 -0
  203. data/ext/boost/mpl/begin_end.hpp +57 -0
  204. data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
  205. data/ext/boost/mpl/clear.hpp +39 -0
  206. data/ext/boost/mpl/clear_fwd.hpp +24 -0
  207. data/ext/boost/mpl/comparison.hpp +24 -0
  208. data/ext/boost/mpl/contains.hpp +41 -0
  209. data/ext/boost/mpl/contains_fwd.hpp +25 -0
  210. data/ext/boost/mpl/deref.hpp +41 -0
  211. data/ext/boost/mpl/distance.hpp +78 -0
  212. data/ext/boost/mpl/distance_fwd.hpp +28 -0
  213. data/ext/boost/mpl/empty_fwd.hpp +24 -0
  214. data/ext/boost/mpl/equal_to.hpp +21 -0
  215. data/ext/boost/mpl/find.hpp +38 -0
  216. data/ext/boost/mpl/find_if.hpp +50 -0
  217. data/ext/boost/mpl/fold.hpp +48 -0
  218. data/ext/boost/mpl/front_fwd.hpp +24 -0
  219. data/ext/boost/mpl/front_inserter.hpp +33 -0
  220. data/ext/boost/mpl/greater.hpp +21 -0
  221. data/ext/boost/mpl/greater_equal.hpp +21 -0
  222. data/ext/boost/mpl/inserter.hpp +32 -0
  223. data/ext/boost/mpl/iter_fold.hpp +49 -0
  224. data/ext/boost/mpl/iter_fold_if.hpp +117 -0
  225. data/ext/boost/mpl/iterator_range.hpp +42 -0
  226. data/ext/boost/mpl/iterator_tags.hpp +27 -0
  227. data/ext/boost/mpl/less.hpp +21 -0
  228. data/ext/boost/mpl/less_equal.hpp +21 -0
  229. data/ext/boost/mpl/limits/list.hpp +21 -0
  230. data/ext/boost/mpl/limits/vector.hpp +21 -0
  231. data/ext/boost/mpl/list.hpp +57 -0
  232. data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
  233. data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
  234. data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
  235. data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
  236. data/ext/boost/mpl/list/aux_/front.hpp +33 -0
  237. data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
  238. data/ext/boost/mpl/list/aux_/item.hpp +55 -0
  239. data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
  240. data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
  241. data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
  242. data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
  243. data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
  244. data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
  245. data/ext/boost/mpl/list/aux_/size.hpp +33 -0
  246. data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
  247. data/ext/boost/mpl/list/list0.hpp +42 -0
  248. data/ext/boost/mpl/list/list10.hpp +43 -0
  249. data/ext/boost/mpl/list/list20.hpp +43 -0
  250. data/ext/boost/mpl/long.hpp +22 -0
  251. data/ext/boost/mpl/long_fwd.hpp +27 -0
  252. data/ext/boost/mpl/minus.hpp +21 -0
  253. data/ext/boost/mpl/multiplies.hpp +53 -0
  254. data/ext/boost/mpl/negate.hpp +81 -0
  255. data/ext/boost/mpl/not_equal_to.hpp +21 -0
  256. data/ext/boost/mpl/numeric_cast.hpp +41 -0
  257. data/ext/boost/mpl/pair.hpp +70 -0
  258. data/ext/boost/mpl/plus.hpp +21 -0
  259. data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
  260. data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
  261. data/ext/boost/mpl/prior.hpp +19 -0
  262. data/ext/boost/mpl/push_back.hpp +53 -0
  263. data/ext/boost/mpl/push_back_fwd.hpp +24 -0
  264. data/ext/boost/mpl/push_front.hpp +52 -0
  265. data/ext/boost/mpl/push_front_fwd.hpp +24 -0
  266. data/ext/boost/mpl/remove_if.hpp +83 -0
  267. data/ext/boost/mpl/reverse_fold.hpp +50 -0
  268. data/ext/boost/mpl/same_as.hpp +55 -0
  269. data/ext/boost/mpl/sequence_tag.hpp +124 -0
  270. data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
  271. data/ext/boost/mpl/size.hpp +42 -0
  272. data/ext/boost/mpl/size_fwd.hpp +24 -0
  273. data/ext/boost/mpl/tag.hpp +52 -0
  274. data/ext/boost/mpl/times.hpp +21 -0
  275. data/ext/boost/mpl/vector.hpp +57 -0
  276. data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
  277. data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
  278. data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
  279. data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
  280. data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
  281. data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
  282. data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
  283. data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
  284. data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
  285. data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
  286. data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
  287. data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
  288. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
  289. data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
  290. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
  291. data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
  292. data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
  293. data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
  294. data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
  295. data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
  296. data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
  297. data/ext/boost/mpl/vector/vector0.hpp +34 -0
  298. data/ext/boost/mpl/vector/vector10.hpp +45 -0
  299. data/ext/boost/mpl/vector/vector20.hpp +45 -0
  300. data/ext/boost/none.hpp +1 -1
  301. data/ext/boost/numeric/conversion/bounds.hpp +24 -0
  302. data/ext/boost/numeric/conversion/cast.hpp +61 -0
  303. data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
  304. data/ext/boost/numeric/conversion/converter.hpp +68 -0
  305. data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
  306. data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
  307. data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
  308. data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
  309. data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
  310. data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
  311. data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
  312. data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
  313. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
  314. data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
  315. data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
  316. data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
  317. data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
  318. data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
  319. data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
  320. data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
  321. data/ext/boost/operators.hpp +3 -1
  322. data/ext/boost/optional/optional.hpp +146 -79
  323. data/ext/boost/optional/optional_fwd.hpp +8 -1
  324. data/ext/boost/preprocessor/cat.hpp +2 -2
  325. data/ext/boost/preprocessor/config/config.hpp +39 -4
  326. data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
  327. data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
  328. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
  329. data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
  330. data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
  331. data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
  332. data/ext/boost/preprocessor/seq/cat.hpp +5 -4
  333. data/ext/boost/preprocessor/seq/size.hpp +0 -1
  334. data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
  335. data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
  336. data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
  337. data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
  338. data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
  339. data/ext/boost/preprocessor/variadic/size.hpp +30 -0
  340. data/ext/boost/range/begin.hpp +17 -6
  341. data/ext/boost/range/concepts.hpp +37 -2
  342. data/ext/boost/range/detail/safe_bool.hpp +72 -0
  343. data/ext/boost/range/end.hpp +14 -9
  344. data/ext/boost/range/iterator_range_core.hpp +120 -12
  345. data/ext/boost/range/size.hpp +21 -5
  346. data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
  347. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
  348. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
  349. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
  350. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
  351. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
  352. data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
  353. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
  354. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
  355. data/ext/boost/smart_ptr/make_shared.hpp +591 -22
  356. data/ext/boost/smart_ptr/shared_array.hpp +29 -1
  357. data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
  358. data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
  359. data/ext/boost/src/pthread/once.cpp +9 -7
  360. data/ext/boost/src/pthread/thread.cpp +32 -28
  361. data/ext/boost/src/pthread/timeconv.inl +4 -5
  362. data/ext/boost/src/tss_null.cpp +5 -1
  363. data/ext/boost/static_assert.hpp +8 -2
  364. data/ext/boost/thread/detail/config.hpp +19 -4
  365. data/ext/boost/thread/detail/move.hpp +11 -5
  366. data/ext/boost/thread/detail/thread.hpp +59 -43
  367. data/ext/boost/thread/exceptions.hpp +9 -9
  368. data/ext/boost/thread/future.hpp +150 -82
  369. data/ext/boost/thread/locks.hpp +101 -60
  370. data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
  371. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
  372. data/ext/boost/thread/pthread/mutex.hpp +17 -14
  373. data/ext/boost/thread/pthread/once.hpp +3 -4
  374. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
  375. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
  376. data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
  377. data/ext/boost/thread/pthread/thread_data.hpp +40 -12
  378. data/ext/boost/thread/thread_time.hpp +5 -0
  379. data/ext/boost/throw_exception.hpp +1 -1
  380. data/ext/boost/token_functions.hpp +34 -10
  381. data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
  382. data/ext/boost/type_traits/alignment_of.hpp +1 -1
  383. data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
  384. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
  385. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
  386. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
  387. data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
  388. data/ext/boost/type_traits/function_traits.hpp +1 -1
  389. data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
  390. data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
  391. data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
  392. data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
  393. data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
  394. data/ext/boost/type_traits/intrinsics.hpp +119 -71
  395. data/ext/boost/type_traits/is_const.hpp +5 -5
  396. data/ext/boost/type_traits/is_convertible.hpp +14 -13
  397. data/ext/boost/type_traits/is_enum.hpp +1 -1
  398. data/ext/boost/type_traits/is_floating_point.hpp +27 -0
  399. data/ext/boost/type_traits/is_function.hpp +3 -3
  400. data/ext/boost/type_traits/is_fundamental.hpp +1 -1
  401. data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
  402. data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
  403. data/ext/boost/type_traits/is_pod.hpp +11 -3
  404. data/ext/boost/type_traits/is_pointer.hpp +2 -2
  405. data/ext/boost/type_traits/is_signed.hpp +8 -3
  406. data/ext/boost/type_traits/is_union.hpp +8 -0
  407. data/ext/boost/type_traits/is_unsigned.hpp +9 -4
  408. data/ext/boost/type_traits/is_volatile.hpp +5 -5
  409. data/ext/boost/type_traits/remove_cv.hpp +4 -3
  410. data/ext/boost/type_traits/remove_pointer.hpp +51 -2
  411. data/ext/boost/type_traits/remove_reference.hpp +2 -2
  412. data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
  413. data/ext/boost/utility/declval.hpp +44 -0
  414. data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
  415. data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
  416. data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
  417. data/ext/boost/utility/in_place_factory.hpp +88 -0
  418. data/ext/boost/utility/result_of.hpp +103 -0
  419. data/ext/boost/utility/swap.hpp +55 -0
  420. data/ext/common/AnsiColorConstants.h +36 -0
  421. data/ext/common/ApplicationPool2/Common.h +87 -0
  422. data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
  423. data/ext/common/ApplicationPool2/Group.h +648 -0
  424. data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
  425. data/ext/common/ApplicationPool2/Options.h +576 -0
  426. data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
  427. data/ext/common/ApplicationPool2/Pool.h +1181 -0
  428. data/ext/common/ApplicationPool2/Process.h +425 -0
  429. data/ext/common/ApplicationPool2/README.md +96 -0
  430. data/ext/common/ApplicationPool2/Session.h +158 -0
  431. data/ext/common/ApplicationPool2/Socket.h +246 -0
  432. data/ext/common/ApplicationPool2/Spawner.h +2212 -0
  433. data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
  434. data/ext/common/BackgroundEventLoop.cpp +129 -0
  435. data/ext/common/BackgroundEventLoop.h +61 -0
  436. data/ext/common/Constants.h +3 -1
  437. data/ext/common/EventedBufferedInput.h +331 -0
  438. data/ext/common/EventedMessageServer.h +17 -34
  439. data/ext/common/EventedServer.h +2 -2
  440. data/ext/common/Exceptions.h +71 -19
  441. data/ext/common/FileDescriptor.h +8 -6
  442. data/ext/common/HttpConstants.h +167 -0
  443. data/ext/common/IniFile.h +24 -0
  444. data/ext/common/Logging.h +62 -849
  445. data/ext/common/MessageReadersWriters.h +19 -0
  446. data/ext/common/MessageServer.h +11 -14
  447. data/ext/common/MultiLibeio.cpp +198 -0
  448. data/ext/common/MultiLibeio.h +67 -0
  449. data/ext/common/ResourceLocator.h +24 -41
  450. data/ext/common/SafeLibev.h +186 -14
  451. data/ext/common/StaticString.h +23 -3
  452. data/ext/common/UnionStation.h +972 -0
  453. data/ext/common/Utils.cpp +168 -24
  454. data/ext/common/Utils.h +25 -3
  455. data/ext/common/Utils/CachedFileStat.hpp +4 -3
  456. data/ext/common/Utils/FileChangeChecker.h +2 -2
  457. data/ext/common/Utils/HashMap.h +50 -0
  458. data/ext/common/Utils/IOUtils.cpp +229 -68
  459. data/ext/common/Utils/IOUtils.h +134 -3
  460. data/ext/common/Utils/Lock.h +28 -0
  461. data/ext/common/Utils/MemoryBarrier.h +52 -0
  462. data/ext/common/Utils/PriorityQueue.h +54 -0
  463. data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
  464. data/ext/common/Utils/ScopeGuard.h +50 -1
  465. data/ext/common/Utils/SmallVector.h +653 -0
  466. data/ext/common/Utils/StrIntUtils.cpp +26 -2
  467. data/ext/common/Utils/StrIntUtils.h +18 -2
  468. data/ext/common/Utils/StringMap.h +125 -8
  469. data/ext/common/Utils/Template.h +212 -0
  470. data/ext/common/Utils/fib.c +699 -0
  471. data/ext/common/Utils/fib.h +101 -0
  472. data/ext/common/Utils/fibpriv.h +67 -0
  473. data/ext/common/Utils/json-forwards.h +249 -0
  474. data/ext/common/Utils/json.h +1855 -0
  475. data/ext/common/Utils/jsoncpp.cpp +4230 -0
  476. data/ext/common/agents/Base.cpp +1126 -0
  477. data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
  478. data/ext/common/agents/EnvPrinter.c +16 -0
  479. data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
  480. data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
  481. data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
  482. data/ext/common/agents/HelperAgent/Main.cpp +497 -0
  483. data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
  484. data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
  485. data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
  486. data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
  487. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
  488. data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
  489. data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
  490. data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
  491. data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
  492. data/ext/common/agents/SpawnPreparer.cpp +127 -0
  493. data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
  494. data/ext/libeio/Changes +72 -0
  495. data/ext/{google/COPYING → libeio/LICENSE} +17 -9
  496. data/ext/libeio/Makefile.am +15 -0
  497. data/ext/libeio/Makefile.in +694 -0
  498. data/ext/libeio/aclocal.m4 +9418 -0
  499. data/ext/libeio/autogen.sh +3 -0
  500. data/ext/libeio/config.guess +1501 -0
  501. data/ext/libeio/config.h.in +136 -0
  502. data/ext/libeio/config.sub +1705 -0
  503. data/ext/libeio/configure +14822 -0
  504. data/ext/libeio/configure.ac +22 -0
  505. data/ext/libeio/demo.c +194 -0
  506. data/ext/libeio/ecb.h +457 -0
  507. data/ext/libeio/eio.c +2816 -0
  508. data/ext/libeio/eio.h +411 -0
  509. data/ext/libeio/install-sh +520 -0
  510. data/ext/libeio/libeio.m4 +211 -0
  511. data/ext/libeio/ltmain.sh +9636 -0
  512. data/ext/libeio/missing +376 -0
  513. data/ext/libeio/xthread.h +166 -0
  514. data/ext/libev/Changes +125 -7
  515. data/ext/libev/Makefile.am +5 -3
  516. data/ext/libev/Makefile.in +209 -120
  517. data/ext/libev/aclocal.m4 +6027 -4619
  518. data/ext/libev/autogen.sh +1 -4
  519. data/ext/libev/config.h.in +11 -7
  520. data/ext/libev/configure +7312 -14993
  521. data/ext/libev/configure.ac +12 -5
  522. data/ext/libev/depcomp +630 -0
  523. data/ext/libev/ev++.h +48 -32
  524. data/ext/libev/ev.c +1173 -391
  525. data/ext/libev/ev.h +315 -181
  526. data/ext/libev/ev_epoll.c +66 -15
  527. data/ext/libev/ev_kqueue.c +20 -18
  528. data/ext/libev/ev_poll.c +27 -23
  529. data/ext/libev/ev_port.c +39 -19
  530. data/ext/libev/ev_select.c +23 -17
  531. data/ext/libev/ev_vars.h +25 -8
  532. data/ext/libev/ev_win32.c +6 -6
  533. data/ext/libev/ev_wrap.h +22 -2
  534. data/ext/libev/event.c +18 -17
  535. data/ext/libev/event.h +16 -4
  536. data/ext/libev/libev.m4 +10 -6
  537. data/ext/libev/ltmain.sh +7353 -5811
  538. data/ext/nginx/Configuration.c +74 -42
  539. data/ext/nginx/Configuration.h +3 -5
  540. data/ext/nginx/ContentHandler.c +26 -83
  541. data/ext/nginx/ContentHandler.h +1 -1
  542. data/ext/nginx/config +13 -9
  543. data/ext/nginx/ngx_http_passenger_module.c +3 -7
  544. data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
  545. data/ext/oxt/detail/context.hpp +90 -0
  546. data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
  547. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
  548. data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
  549. data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
  550. data/ext/oxt/dynamic_thread_group.hpp +27 -1
  551. data/ext/oxt/implementation.cpp +415 -0
  552. data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
  553. data/ext/oxt/macros.hpp +32 -1
  554. data/ext/oxt/spin_lock.hpp +6 -11
  555. data/ext/oxt/system_calls.cpp +204 -16
  556. data/ext/oxt/system_calls.hpp +85 -45
  557. data/ext/oxt/thread.hpp +13 -117
  558. data/ext/ruby/passenger_native_support.c +82 -237
  559. data/helper-scripts/backtrace-sanitizer.rb +114 -0
  560. data/helper-scripts/classic-rails-loader.rb +135 -0
  561. data/helper-scripts/classic-rails-preloader.rb +161 -0
  562. data/helper-scripts/node-loader.js +314 -0
  563. data/helper-scripts/rack-loader.rb +104 -0
  564. data/helper-scripts/rack-preloader.rb +132 -0
  565. data/helper-scripts/wsgi-loader.py +231 -0
  566. data/helper-scripts/wsgi-preloader.py +1 -0
  567. data/lib/phusion_passenger.rb +159 -61
  568. data/lib/phusion_passenger/abstract_installer.rb +182 -87
  569. data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
  570. data/lib/phusion_passenger/analytics_logger.rb +5 -4
  571. data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
  572. data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
  573. data/lib/phusion_passenger/common_library.rb +441 -0
  574. data/lib/phusion_passenger/console_text_template.rb +4 -16
  575. data/lib/phusion_passenger/constants.rb +1 -8
  576. data/lib/phusion_passenger/debug_logging.rb +5 -2
  577. data/lib/phusion_passenger/dependencies.rb +51 -13
  578. data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
  579. data/lib/phusion_passenger/message_channel.rb +3 -47
  580. data/lib/phusion_passenger/message_client.rb +2 -2
  581. data/lib/phusion_passenger/native_support.rb +36 -15
  582. data/lib/phusion_passenger/packaging.rb +8 -11
  583. data/lib/phusion_passenger/platform_info.rb +25 -17
  584. data/lib/phusion_passenger/platform_info/apache.rb +10 -7
  585. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
  586. data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
  587. data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
  588. data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
  589. data/lib/phusion_passenger/public_api.rb +1 -4
  590. data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
  591. data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
  592. data/lib/phusion_passenger/request_handler.rb +500 -0
  593. data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
  594. data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
  595. data/lib/phusion_passenger/standalone/command.rb +36 -15
  596. data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
  597. data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
  598. data/lib/phusion_passenger/standalone/start_command.rb +44 -39
  599. data/lib/phusion_passenger/standalone/utils.rb +5 -5
  600. data/lib/phusion_passenger/utils.rb +35 -914
  601. data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
  602. data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
  603. data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
  604. data/lib/phusion_passenger/utils/tee_input.rb +174 -0
  605. data/lib/phusion_passenger/utils/tmpio.rb +33 -0
  606. data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
  607. data/resources/mime.types +5 -1
  608. data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
  609. data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
  610. data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
  611. data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
  612. data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
  613. data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  614. data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
  615. data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
  616. data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
  617. data/resources/templates/error_layout.html.template +89 -0
  618. data/resources/templates/general_error.html.template +1 -0
  619. data/resources/templates/general_error_with_html.html.template +1 -0
  620. data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
  621. data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
  622. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
  623. data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
  624. data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
  625. data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
  626. data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
  627. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
  628. data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
  629. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
  630. data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  631. data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
  632. data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
  633. data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
  634. data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
  635. data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
  636. data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
  637. data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
  638. data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
  639. data/resources/templates/undisclosed_error.html.template +25 -0
  640. data/test/config.json.example +42 -0
  641. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
  642. data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
  643. data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
  644. data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
  645. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
  646. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
  647. data/test/cxx/BufferedIOTest.cpp +7 -7
  648. data/test/cxx/CxxTestMain.cpp +65 -2
  649. data/test/cxx/FileBackedPipeTest.cpp +626 -0
  650. data/test/cxx/FileChangeCheckerTest.cpp +20 -18
  651. data/test/cxx/FilterSupportTest.cpp +5 -5
  652. data/test/cxx/IOUtilsTest.cpp +11 -4
  653. data/test/cxx/MessageReadersWritersTest.cpp +1 -1
  654. data/test/cxx/MessageServerTest.cpp +31 -30
  655. data/test/cxx/RequestHandlerTest.cpp +777 -0
  656. data/test/cxx/ScgiRequestParserTest.cpp +36 -16
  657. data/test/cxx/ServerInstanceDirTest.cpp +1 -1
  658. data/test/cxx/StringMapTest.cpp +61 -0
  659. data/test/cxx/TemplateTest.cpp +118 -0
  660. data/test/cxx/TestSupport.cpp +25 -68
  661. data/test/cxx/TestSupport.h +81 -41
  662. data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
  663. data/test/cxx/UtilsTest.cpp +59 -5
  664. data/test/integration_tests/apache2_tests.rb +2 -2
  665. data/test/integration_tests/nginx_tests.rb +1 -1
  666. data/test/integration_tests/spec_helper.rb +7 -5
  667. data/test/oxt/oxt_test_main.cpp +2 -0
  668. data/test/oxt/syscall_interruption_test.cpp +1 -0
  669. data/test/ruby/classic_rails/loader_spec.rb +48 -0
  670. data/test/ruby/classic_rails/preloader_spec.rb +54 -0
  671. data/test/ruby/rack/loader_spec.rb +62 -0
  672. data/test/ruby/rack/preloader_spec.rb +74 -0
  673. data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
  674. data/test/ruby/shared/loader_spec.rb +241 -0
  675. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
  676. data/test/ruby/shared/ruby_loader_spec.rb +55 -0
  677. data/test/ruby/spec_helper.rb +8 -53
  678. data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
  679. data/test/ruby/utils_spec.rb +10 -683
  680. data/test/stub/rack/config.ru +28 -3
  681. data/test/stub/rack/start.rb +47 -0
  682. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
  683. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
  684. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
  685. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
  686. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
  687. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
  688. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
  689. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
  690. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
  691. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
  692. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
  693. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
  694. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
  695. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
  696. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
  697. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
  698. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
  699. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
  700. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
  701. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
  702. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
  703. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
  704. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
  705. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
  706. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
  707. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
  708. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
  709. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
  710. data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
  711. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
  712. data/test/stub/rails3.0/Gemfile.lock +80 -0
  713. data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
  714. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
  715. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
  716. data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
  717. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
  718. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
  719. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
  720. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
  721. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
  722. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
  723. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
  724. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
  725. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
  726. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
  727. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
  728. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
  729. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
  730. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
  731. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
  732. data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
  733. data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
  734. data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
  735. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
  736. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
  737. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
  738. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
  739. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
  740. data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
  741. data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
  742. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
  743. data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
  744. data/test/stub/start_error.pl +24 -0
  745. data/test/stub/wsgi/passenger_wsgi.py +71 -3
  746. data/test/support/apache2_controller.rb +2 -2
  747. data/test/support/placebo-preloader.rb +88 -0
  748. data/test/support/test_helper.rb +1 -14
  749. data/test/tut/tut.h +11 -4
  750. metadata +590 -326
  751. data.tar.gz.asc +0 -12
  752. data/PACKAGING.TXT +0 -25
  753. data/build/config.rb +0 -46
  754. data/ext/apache2/HelperAgent.cpp +0 -364
  755. data/ext/boost/call_traits.hpp +0 -24
  756. data/ext/boost/detail/call_traits.hpp +0 -164
  757. data/ext/common/AbstractSpawnManager.h +0 -110
  758. data/ext/common/AgentBase.cpp +0 -432
  759. data/ext/common/ApplicationPool/Client.h +0 -788
  760. data/ext/common/ApplicationPool/Interface.h +0 -295
  761. data/ext/common/ApplicationPool/Pool.h +0 -1327
  762. data/ext/common/ApplicationPool/Server.h +0 -479
  763. data/ext/common/MessageChannel.h +0 -494
  764. data/ext/common/PoolOptions.h +0 -518
  765. data/ext/common/Process.h +0 -253
  766. data/ext/common/Session.h +0 -436
  767. data/ext/common/SpawnManager.h +0 -611
  768. data/ext/google/ChangeLog +0 -167
  769. data/ext/google/dense_hash_map +0 -310
  770. data/ext/google/dense_hash_set +0 -287
  771. data/ext/google/sparse_hash_map +0 -294
  772. data/ext/google/sparse_hash_set +0 -275
  773. data/ext/google/sparsehash/densehashtable.h +0 -1062
  774. data/ext/google/sparsehash/sparseconfig.h +0 -55
  775. data/ext/google/sparsehash/sparsehashtable.h +0 -1015
  776. data/ext/google/sparsetable +0 -1468
  777. data/ext/google/type_traits.h +0 -250
  778. data/ext/nginx/HelperAgent.cpp +0 -1355
  779. data/ext/nginx/ScgiRequestParser.h +0 -375
  780. data/ext/oxt/backtrace.cpp +0 -185
  781. data/ext/oxt/tracable_exception.cpp +0 -89
  782. data/helper-scripts/passenger-spawn-server +0 -106
  783. data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
  784. data/lib/phusion_passenger/abstract_server.rb +0 -372
  785. data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
  786. data/lib/phusion_passenger/app_process.rb +0 -174
  787. data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
  788. data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
  789. data/lib/phusion_passenger/exceptions.rb +0 -103
  790. data/lib/phusion_passenger/html_template.rb +0 -107
  791. data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
  792. data/lib/phusion_passenger/spawn_manager.rb +0 -359
  793. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
  794. data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
  795. data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
  796. data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
  797. data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
  798. data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
  799. data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
  800. data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
  801. data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
  802. data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
  803. data/test/config.yml.example +0 -41
  804. data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
  805. data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
  806. data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
  807. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
  808. data/test/cxx/MessageChannelTest.cpp +0 -557
  809. data/test/cxx/PoolOptionsTest.cpp +0 -116
  810. data/test/cxx/SpawnManagerTest.cpp +0 -161
  811. data/test/ruby/abstract_server_collection_spec.rb +0 -247
  812. data/test/ruby/abstract_server_spec.rb +0 -61
  813. data/test/ruby/app_process_spec.rb +0 -43
  814. data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
  815. data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
  816. data/test/ruby/rack/application_spawner_spec.rb +0 -116
  817. data/test/ruby/shared/abstract_server_spec.rb +0 -23
  818. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
  819. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
  820. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
  821. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
  822. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
  823. data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
  824. data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
  825. data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
  826. data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
  827. data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
  828. data/test/ruby/spawn_manager_spec.rb +0 -134
  829. data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
  830. data/test/stub/message_channel.rb +0 -11
  831. data/test/stub/message_channel_2.rb +0 -12
  832. data/test/stub/message_channel_3.rb +0 -19
  833. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
  834. data/test/stub/spawn_server.rb +0 -22
  835. metadata.gz.asc +0 -12
@@ -0,0 +1,150 @@
1
+ // boost\math\tools\promotion.hpp
2
+
3
+ // Copyright John Maddock 2006.
4
+ // Copyright Paul A. Bristow 2006.
5
+
6
+ // Use, modification and distribution are subject to the
7
+ // Boost Software License, Version 1.0.
8
+ // (See accompanying file LICENSE_1_0.txt
9
+ // or copy at http://www.boost.org/LICENSE_1_0.txt)
10
+
11
+ // Promote arguments functions to allow math functions to have arguments
12
+ // provided as integer OR real (floating-point, built-in or UDT)
13
+ // (called ArithmeticType in functions that use promotion)
14
+ // that help to reduce the risk of creating multiple instantiations.
15
+ // Allows creation of an inline wrapper that forwards to a foo(RT, RT) function,
16
+ // so you never get to instantiate any mixed foo(RT, IT) functions.
17
+
18
+ #ifndef BOOST_MATH_PROMOTION_HPP
19
+ #define BOOST_MATH_PROMOTION_HPP
20
+
21
+ #ifdef _MSC_VER
22
+ #pragma once
23
+ #endif
24
+
25
+ // Boost type traits:
26
+ #include <boost/math/tools/config.hpp>
27
+ #include <boost/type_traits/is_floating_point.hpp> // for boost::is_floating_point;
28
+ #include <boost/type_traits/is_integral.hpp> // for boost::is_integral
29
+ #include <boost/type_traits/is_convertible.hpp> // for boost::is_convertible
30
+ #include <boost/type_traits/is_same.hpp>// for boost::is_same
31
+ #include <boost/type_traits/remove_cv.hpp>// for boost::remove_cv
32
+ // Boost Template meta programming:
33
+ #include <boost/mpl/if.hpp> // for boost::mpl::if_c.
34
+ #include <boost/mpl/and.hpp> // for boost::mpl::if_c.
35
+ #include <boost/mpl/or.hpp> // for boost::mpl::if_c.
36
+ #include <boost/mpl/not.hpp> // for boost::mpl::if_c.
37
+
38
+ #ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
39
+ #include <boost/static_assert.hpp>
40
+ #endif
41
+
42
+ namespace boost
43
+ {
44
+ namespace math
45
+ {
46
+ namespace tools
47
+ {
48
+ // If either T1 or T2 is an integer type,
49
+ // pretend it was a double (for the purposes of further analysis).
50
+ // Then pick the wider of the two floating-point types
51
+ // as the actual signature to forward to.
52
+ // For example:
53
+ // foo(int, short) -> double foo(double, double);
54
+ // foo(int, float) -> double foo(double, double);
55
+ // Note: NOT float foo(float, float)
56
+ // foo(int, double) -> foo(double, double);
57
+ // foo(double, float) -> double foo(double, double);
58
+ // foo(double, float) -> double foo(double, double);
59
+ // foo(any-int-or-float-type, long double) -> foo(long double, long double);
60
+ // but ONLY float foo(float, float) is unchanged.
61
+ // So the only way to get an entirely float version is to call foo(1.F, 2.F),
62
+ // But since most (all?) the math functions convert to double internally,
63
+ // probably there would not be the hoped-for gain by using float here.
64
+
65
+ // This follows the C-compatible conversion rules of pow, etc
66
+ // where pow(int, float) is converted to pow(double, double).
67
+
68
+ template <class T>
69
+ struct promote_arg
70
+ { // If T is integral type, then promote to double.
71
+ typedef typename mpl::if_<is_integral<T>, double, T>::type type;
72
+ };
73
+ // These full specialisations reduce mpl::if_ usage and speed up
74
+ // compilation:
75
+ template <> struct promote_arg<float> { typedef float type; };
76
+ template <> struct promote_arg<double>{ typedef double type; };
77
+ template <> struct promote_arg<long double> { typedef long double type; };
78
+ template <> struct promote_arg<int> { typedef double type; };
79
+
80
+ template <class T1, class T2>
81
+ struct promote_args_2
82
+ { // Promote, if necessary, & pick the wider of the two floating-point types.
83
+ // for both parameter types, if integral promote to double.
84
+ typedef typename promote_arg<T1>::type T1P; // T1 perhaps promoted.
85
+ typedef typename promote_arg<T2>::type T2P; // T2 perhaps promoted.
86
+
87
+ typedef typename mpl::if_<
88
+ typename mpl::and_<is_floating_point<T1P>, is_floating_point<T2P> >::type, // both T1P and T2P are floating-point?
89
+ typename mpl::if_< typename mpl::or_<is_same<long double, T1P>, is_same<long double, T2P> >::type, // either long double?
90
+ long double, // then result type is long double.
91
+ typename mpl::if_< typename mpl::or_<is_same<double, T1P>, is_same<double, T2P> >::type, // either double?
92
+ double, // result type is double.
93
+ float // else result type is float.
94
+ >::type
95
+ >::type,
96
+ // else one or the other is a user-defined type:
97
+ typename mpl::if_< typename mpl::and_<mpl::not_<is_floating_point<T2P> >, ::boost::is_convertible<T1P, T2P> >, T2P, T1P>::type>::type type;
98
+ }; // promote_arg2
99
+ // These full specialisations reduce mpl::if_ usage and speed up
100
+ // compilation:
101
+ template <> struct promote_args_2<float, float> { typedef float type; };
102
+ template <> struct promote_args_2<double, double>{ typedef double type; };
103
+ template <> struct promote_args_2<long double, long double> { typedef long double type; };
104
+ template <> struct promote_args_2<int, int> { typedef double type; };
105
+ template <> struct promote_args_2<int, float> { typedef double type; };
106
+ template <> struct promote_args_2<float, int> { typedef double type; };
107
+ template <> struct promote_args_2<int, double> { typedef double type; };
108
+ template <> struct promote_args_2<double, int> { typedef double type; };
109
+ template <> struct promote_args_2<int, long double> { typedef long double type; };
110
+ template <> struct promote_args_2<long double, int> { typedef long double type; };
111
+ template <> struct promote_args_2<float, double> { typedef double type; };
112
+ template <> struct promote_args_2<double, float> { typedef double type; };
113
+ template <> struct promote_args_2<float, long double> { typedef long double type; };
114
+ template <> struct promote_args_2<long double, float> { typedef long double type; };
115
+ template <> struct promote_args_2<double, long double> { typedef long double type; };
116
+ template <> struct promote_args_2<long double, double> { typedef long double type; };
117
+
118
+ template <class T1, class T2=float, class T3=float, class T4=float, class T5=float, class T6=float>
119
+ struct promote_args
120
+ {
121
+ typedef typename promote_args_2<
122
+ typename remove_cv<T1>::type,
123
+ typename promote_args_2<
124
+ typename remove_cv<T2>::type,
125
+ typename promote_args_2<
126
+ typename remove_cv<T3>::type,
127
+ typename promote_args_2<
128
+ typename remove_cv<T4>::type,
129
+ typename promote_args_2<
130
+ typename remove_cv<T5>::type, typename remove_cv<T6>::type
131
+ >::type
132
+ >::type
133
+ >::type
134
+ >::type
135
+ >::type type;
136
+
137
+ #ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
138
+ //
139
+ // Guard against use of long double if it's not supported:
140
+ //
141
+ BOOST_STATIC_ASSERT((0 == ::boost::is_same<type, long double>::value));
142
+ #endif
143
+ };
144
+
145
+ } // namespace tools
146
+ } // namespace math
147
+ } // namespace boost
148
+
149
+ #endif // BOOST_MATH_PROMOTION_HPP
150
+
@@ -0,0 +1,29 @@
1
+ // Copyright John Maddock 2006.
2
+ // Use, modification and distribution are subject to the
3
+ // Boost Software License, Version 1.0. (See accompanying file
4
+ // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
+
6
+ #ifndef BOOST_MATH_TOOLS_REAL_CAST_HPP
7
+ #define BOOST_MATH_TOOLS_REAL_CAST_HPP
8
+
9
+ #ifdef _MSC_VER
10
+ #pragma once
11
+ #endif
12
+
13
+ namespace boost{ namespace math
14
+ {
15
+ namespace tools
16
+ {
17
+ template <class To, class T>
18
+ inline To real_cast(T t)
19
+ {
20
+ return static_cast<To>(t);
21
+ }
22
+ } // namespace tools
23
+ } // namespace math
24
+ } // namespace boost
25
+
26
+ #endif // BOOST_MATH_TOOLS_REAL_CAST_HPP
27
+
28
+
29
+
@@ -0,0 +1,97 @@
1
+ // Copyright John Maddock 2007.
2
+ // Copyright Paul A. Bristow 2007.
3
+
4
+ // Use, modification and distribution are subject to the
5
+ // Boost Software License, Version 1.0.
6
+ // (See accompanying file LICENSE_1_0.txt
7
+ // or copy at http://www.boost.org/LICENSE_1_0.txt)
8
+
9
+ #ifndef BOOST_MATH_TOOLS_USER_HPP
10
+ #define BOOST_MATH_TOOLS_USER_HPP
11
+
12
+ #ifdef _MSC_VER
13
+ #pragma once
14
+ #endif
15
+
16
+ // This file can be modified by the user to change the default policies.
17
+ // See "Changing the Policy Defaults" in documentation.
18
+
19
+ // define this if the platform has no long double functions,
20
+ // or if the long double versions have only double precision:
21
+ //
22
+ // #define BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
23
+ //
24
+ // Performance tuning options:
25
+ //
26
+ // #define BOOST_MATH_POLY_METHOD 3
27
+ // #define BOOST_MATH_RATIONAL_METHOD 3
28
+ //
29
+ // The maximum order of polynomial that will be evaluated
30
+ // via an unrolled specialisation:
31
+ //
32
+ // #define BOOST_MATH_MAX_POLY_ORDER 17
33
+ //
34
+ // decide whether to store constants as integers or reals:
35
+ //
36
+ // #define BOOST_MATH_INT_TABLE_TYPE(RT, IT) IT
37
+
38
+ //
39
+ // Default policies follow:
40
+ //
41
+ // Domain errors:
42
+ //
43
+ // #define BOOST_MATH_DOMAIN_ERROR_POLICY throw_on_error
44
+ //
45
+ // Pole errors:
46
+ //
47
+ // #define BOOST_MATH_POLE_ERROR_POLICY throw_on_error
48
+ //
49
+ // Overflow Errors:
50
+ //
51
+ // #define BOOST_MATH_OVERFLOW_ERROR_POLICY throw_on_error
52
+ //
53
+ // Internal Evaluation Errors:
54
+ //
55
+ // #define BOOST_MATH_EVALUATION_ERROR_POLICY throw_on_error
56
+ //
57
+ // Underfow:
58
+ //
59
+ // #define BOOST_MATH_UNDERFLOW_ERROR_POLICY ignore_error
60
+ //
61
+ // Denorms:
62
+ //
63
+ // #define BOOST_MATH_DENORM_ERROR_POLICY ignore_error
64
+ //
65
+ // Max digits to use for internal calculations:
66
+ //
67
+ // #define BOOST_MATH_DIGITS10_POLICY 0
68
+ //
69
+ // Promote floats to doubles internally?
70
+ //
71
+ // #define BOOST_MATH_PROMOTE_FLOAT_POLICY true
72
+ //
73
+ // Promote doubles to long double internally:
74
+ //
75
+ // #define BOOST_MATH_PROMOTE_DOUBLE_POLICY true
76
+ //
77
+ // What do discrete quantiles return?
78
+ //
79
+ // #define BOOST_MATH_DISCRETE_QUANTILE_POLICY integer_round_outwards
80
+ //
81
+ // If a function is mathematically undefined
82
+ // (for example the Cauchy distribution has no mean),
83
+ // then do we stop the code from compiling?
84
+ //
85
+ // #define BOOST_MATH_ASSERT_UNDEFINED_POLICY true
86
+ //
87
+ // Maximum series iterstions permitted:
88
+ //
89
+ // #define BOOST_MATH_MAX_SERIES_ITERATION_POLICY 1000000
90
+ //
91
+ // Maximum root finding steps permitted:
92
+ //
93
+ // define BOOST_MATH_MAX_ROOT_ITERATION_POLICY 200
94
+
95
+ #endif // BOOST_MATH_TOOLS_USER_HPP
96
+
97
+
@@ -0,0 +1,1222 @@
1
+ //////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // (C) Copyright David Abrahams, Vicente Botet 2009.
4
+ // (C) Copyright Ion Gaztanaga 2009-2010.
5
+ // Distributed under the Boost Software License, Version 1.0.
6
+ // (See accompanying file LICENSE_1_0.txt or copy at
7
+ // http://www.boost.org/LICENSE_1_0.txt)
8
+ //
9
+ // See http://www.boost.org/libs/move for documentation.
10
+ //
11
+ //////////////////////////////////////////////////////////////////////////////
12
+
13
+ //! \file
14
+
15
+ #ifndef BOOST_MOVE_MOVE_HPP
16
+ #define BOOST_MOVE_MOVE_HPP
17
+
18
+ #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
19
+
20
+ /// @cond
21
+
22
+ #include <boost/config.hpp>
23
+
24
+ #ifdef BOOST_MSVC
25
+ #ifndef _CRT_SECURE_NO_DEPRECATE
26
+ #define BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
27
+ #define _CRT_SECURE_NO_DEPRECATE
28
+ #endif
29
+ #ifndef _SCL_SECURE_NO_WARNINGS
30
+ #define BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
31
+ #define _SCL_SECURE_NO_WARNINGS
32
+ #endif
33
+ #pragma warning (push)
34
+ #pragma warning(disable:4996)
35
+ #endif
36
+
37
+ #include <algorithm> //copy, copy_backward
38
+ #include <memory> //uninitialized_copy
39
+ #include <iterator> //std::iterator
40
+
41
+ #define BOOST_MOVE_AVOID_BOOST_DEPENDENCIES
42
+
43
+ //If boost dependencies are avoided include all machinery
44
+ #if !defined(BOOST_MOVE_AVOID_BOOST_DEPENDENCIES)
45
+ #include <boost/utility/enable_if.hpp>
46
+ #include <boost/utility/addressof.hpp>
47
+ #include <boost/mpl/if.hpp>
48
+ #include <boost/mpl/bool.hpp>
49
+ #include <boost/mpl/and.hpp>
50
+ #include <boost/mpl/not.hpp>
51
+ #include <boost/mpl/identity.hpp>
52
+ #include <boost/type_traits/is_class.hpp>
53
+ #include <boost/type_traits/is_convertible.hpp>
54
+ #include <boost/type_traits/has_trivial_destructor.hpp>
55
+ #include <boost/type_traits/integral_constant.hpp>
56
+
57
+ #define BOOST_MOVE_MPL_NS ::boost::mpl
58
+ #define BOOST_MOVE_BOOST_NS ::boost
59
+ #else
60
+ #define BOOST_MOVE_MPL_NS ::boost::move_detail
61
+ #define BOOST_MOVE_BOOST_NS ::boost::move_detail
62
+ #endif //#ifdef BOOST_MOVE_AVOID_BOOST_DEPENDENCIES
63
+
64
+ //Small meta-typetraits to support move
65
+ #ifdef BOOST_MOVE_AVOID_BOOST_DEPENDENCIES
66
+
67
+ namespace boost {
68
+ namespace move_detail {
69
+
70
+ //if_
71
+ template<bool C, typename T1, typename T2>
72
+ struct if_c
73
+ {
74
+ typedef T1 type;
75
+ };
76
+
77
+ template<typename T1, typename T2>
78
+ struct if_c<false,T1,T2>
79
+ {
80
+ typedef T2 type;
81
+ };
82
+
83
+ template<typename T1, typename T2, typename T3>
84
+ struct if_
85
+ {
86
+ typedef typename if_c<0 != T1::value, T2, T3>::type type;
87
+ };
88
+
89
+ //enable_if_
90
+ template <bool B, class T = void>
91
+ struct enable_if_c
92
+ {
93
+ typedef T type;
94
+ };
95
+
96
+ template <class T>
97
+ struct enable_if_c<false, T> {};
98
+
99
+ template <class Cond, class T = void>
100
+ struct enable_if : public enable_if_c<Cond::value, T> {};
101
+
102
+ template <class Cond, class T = void>
103
+ struct disable_if : public enable_if_c<!Cond::value, T> {};
104
+
105
+ //integral_constant
106
+ template<class T, T v>
107
+ struct integral_constant
108
+ {
109
+ static const T value = v;
110
+ typedef T value_type;
111
+ typedef integral_constant<T, v> type;
112
+ };
113
+
114
+ //identity
115
+ template <class T>
116
+ struct identity
117
+ {
118
+ typedef T type;
119
+ };
120
+
121
+ //is_convertible
122
+ template <class T, class U>
123
+ class is_convertible
124
+ {
125
+ typedef char true_t;
126
+ class false_t { char dummy[2]; };
127
+ static true_t dispatch(U);
128
+ static false_t dispatch(...);
129
+ static T &trigger();
130
+ public:
131
+ enum { value = sizeof(dispatch(trigger())) == sizeof(true_t) };
132
+ };
133
+
134
+ //and_ not_
135
+ template <typename Condition1, typename Condition2, typename Condition3 = integral_constant<bool, true> >
136
+ struct and_
137
+ : public integral_constant<bool, Condition1::value && Condition2::value && Condition3::value>
138
+ {};
139
+
140
+ template <typename Boolean>
141
+ struct not_
142
+ : public integral_constant<bool, !Boolean::value>
143
+ {};
144
+
145
+ //is_lvalue_reference
146
+ template<class T>
147
+ struct is_lvalue_reference
148
+ : public integral_constant<bool, false>
149
+ {};
150
+
151
+ template<class T>
152
+ struct is_lvalue_reference<T&>
153
+ : public integral_constant<bool, true>
154
+ {};
155
+
156
+ //has_trivial_destructor
157
+ template<class T>
158
+ struct has_trivial_destructor
159
+ : public integral_constant<bool, false>
160
+ {};
161
+
162
+ //addressof
163
+ template<class T> struct addr_impl_ref
164
+ {
165
+ T & v_;
166
+ inline addr_impl_ref( T & v ): v_( v ) {}
167
+ inline operator T& () const { return v_; }
168
+
169
+ private:
170
+ addr_impl_ref & operator=(const addr_impl_ref &);
171
+ };
172
+
173
+ template<class T> struct addressof_impl
174
+ {
175
+ static inline T * f( T & v, long )
176
+ {
177
+ return reinterpret_cast<T*>(
178
+ &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
179
+ }
180
+
181
+ static inline T * f( T * v, int )
182
+ { return v; }
183
+ };
184
+
185
+ template<class T>
186
+ inline T * addressof( T & v )
187
+ {
188
+ return ::boost::move_detail::addressof_impl<T>::f
189
+ ( ::boost::move_detail::addr_impl_ref<T>( v ), 0 );
190
+ }
191
+
192
+ } //namespace move_detail {
193
+ } //namespace boost {
194
+
195
+ #endif //BOOST_MOVE_AVOID_BOOST_DEPENDENCIES
196
+
197
+ //Compiler workaround detection
198
+ #if !defined(BOOST_NO_RVALUE_REFERENCES)
199
+
200
+ #if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 5) && !defined(__clang__)
201
+ //Pre-standard rvalue binding rules
202
+ #define BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES
203
+ #elif defined(_MSC_VER) && (_MSC_VER == 1600)
204
+ //Standard rvalue binding rules but with some bugs
205
+ #define BOOST_MOVE_MSVC_10_MEMBER_RVALUE_REF_BUG
206
+ //Use standard library for MSVC to avoid namespace issues as
207
+ //some move calls in the STL are not fully qualified.
208
+ //#define BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
209
+ #endif
210
+
211
+ #endif
212
+
213
+ /// @endcond
214
+
215
+ #endif //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
216
+
217
+ #if defined(BOOST_NO_RVALUE_REFERENCES) && !defined(BOOST_MOVE_DOXYGEN_INVOKED)
218
+
219
+ //Move emulation rv breaks standard aliasing rules so add workarounds for some compilers
220
+ #ifdef __GNUC__
221
+ #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS __attribute__((__may_alias__))
222
+ #else
223
+ #define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS
224
+ #endif
225
+
226
+ namespace boost {
227
+
228
+ namespace move_detail {
229
+ template<class T>
230
+ struct is_class_or_union
231
+ {
232
+ struct twochar { char _[2]; };
233
+ template <class U>
234
+ static char is_class_or_union_tester(void(U::*)(void));
235
+ template <class U>
236
+ static twochar is_class_or_union_tester(...);
237
+ static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char);
238
+ };
239
+ struct empty{};
240
+ }
241
+
242
+ //////////////////////////////////////////////////////////////////////////////
243
+ //
244
+ // struct rv
245
+ //
246
+ //////////////////////////////////////////////////////////////////////////////
247
+ template <class T>
248
+ class rv
249
+ : public BOOST_MOVE_MPL_NS::if_c
250
+ < ::boost::move_detail::is_class_or_union<T>::value
251
+ , T
252
+ , ::boost::move_detail::empty
253
+ >::type
254
+ {
255
+ rv();
256
+ ~rv();
257
+ rv(rv const&);
258
+ void operator=(rv const&);
259
+ } BOOST_MOVE_ATTRIBUTE_MAY_ALIAS;
260
+
261
+
262
+
263
+ //////////////////////////////////////////////////////////////////////////////
264
+ //
265
+ // move_detail::is_rv
266
+ //
267
+ //////////////////////////////////////////////////////////////////////////////
268
+
269
+ namespace move_detail {
270
+
271
+ template <class T>
272
+ struct is_rv
273
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, false>
274
+ {};
275
+
276
+ template <class T>
277
+ struct is_rv< rv<T> >
278
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
279
+ {};
280
+
281
+ template <class T>
282
+ struct is_rv< const rv<T> >
283
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
284
+ {};
285
+
286
+ } //namespace move_detail {
287
+
288
+ //////////////////////////////////////////////////////////////////////////////
289
+ //
290
+ // has_move_emulation_enabled
291
+ //
292
+ //////////////////////////////////////////////////////////////////////////////
293
+ template<class T>
294
+ struct has_move_emulation_enabled
295
+ : BOOST_MOVE_BOOST_NS::is_convertible< T, ::boost::rv<T>& >
296
+ {};
297
+
298
+ template<class T>
299
+ struct has_move_emulation_enabled<T&>
300
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, false>
301
+ {};
302
+
303
+ template<class T>
304
+ struct has_move_emulation_enabled< ::boost::rv<T> >
305
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, false>
306
+ {};
307
+
308
+ template <class T>
309
+ struct has_move_emulation_enabled_aux
310
+ : has_move_emulation_enabled<T> {};
311
+
312
+ template <class T>
313
+ struct has_nothrow_move
314
+ : public BOOST_MOVE_BOOST_NS::integral_constant<bool, false>
315
+ {};
316
+
317
+ //////////////////////////////////////////////////////////////////////////////
318
+ //
319
+ // move()
320
+ //
321
+ //////////////////////////////////////////////////////////////////////////////
322
+
323
+ template <class T>
324
+ inline typename BOOST_MOVE_BOOST_NS::disable_if<has_move_emulation_enabled_aux<T>, T&>::type move(T& x)
325
+ {
326
+ return x;
327
+ }
328
+
329
+ template <class T>
330
+ inline typename BOOST_MOVE_BOOST_NS::enable_if<has_move_emulation_enabled<T>, rv<T>&>::type move(T& x)
331
+ {
332
+ return *static_cast<rv<T>* >(BOOST_MOVE_BOOST_NS::addressof(x));
333
+ }
334
+
335
+ template <class T>
336
+ inline typename BOOST_MOVE_BOOST_NS::enable_if<has_move_emulation_enabled<T>, rv<T>&>::type move(rv<T>& x)
337
+ {
338
+ return x;
339
+ }
340
+
341
+ #define BOOST_RV_REF(TYPE)\
342
+ ::boost::rv< TYPE >& \
343
+ //
344
+
345
+ #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
346
+ ::boost::rv< TYPE<ARG1, ARG2> >& \
347
+ //
348
+
349
+ #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
350
+ ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
351
+ //
352
+
353
+
354
+ #define BOOST_FWD_REF(TYPE)\
355
+ const TYPE & \
356
+ //
357
+
358
+ #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
359
+ const ::boost::rv< TYPE >& \
360
+ //
361
+
362
+ #define BOOST_COPY_ASSIGN_REF(TYPE)\
363
+ const ::boost::rv< TYPE >& \
364
+ //
365
+
366
+ #define BOOST_MOVE_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
367
+ const ::boost::rv< TYPE<ARG1, ARG2> >& \
368
+ //
369
+
370
+ #define BOOST_MOVE_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
371
+ const ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
372
+ //
373
+
374
+ //////////////////////////////////////////////////////////////////////////////
375
+ //
376
+ // forward()
377
+ //
378
+ //////////////////////////////////////////////////////////////////////////////
379
+
380
+ template <class T>
381
+ inline typename BOOST_MOVE_BOOST_NS::enable_if< ::boost::move_detail::is_rv<T>, T &>::type
382
+ forward(const typename BOOST_MOVE_MPL_NS::identity<T>::type &x)
383
+ {
384
+ return const_cast<T&>(x);
385
+ }
386
+
387
+ template <class T>
388
+ inline typename BOOST_MOVE_BOOST_NS::disable_if< ::boost::move_detail::is_rv<T>, const T &>::type
389
+ forward(const typename BOOST_MOVE_MPL_NS::identity<T>::type &x)
390
+ {
391
+ return x;
392
+ }
393
+
394
+ //////////////////////////////////////////////////////////////////////////////
395
+ //
396
+ // BOOST_MOVABLE_BUT_NOT_COPYABLE
397
+ //
398
+ //////////////////////////////////////////////////////////////////////////////
399
+ #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
400
+ private:\
401
+ TYPE(TYPE &);\
402
+ TYPE& operator=(TYPE &);\
403
+ public:\
404
+ operator ::boost::rv<TYPE>&() \
405
+ { return *static_cast< ::boost::rv<TYPE>* >(this); }\
406
+ operator const ::boost::rv<TYPE>&() const \
407
+ { return *static_cast<const ::boost::rv<TYPE>* >(this); }\
408
+ private:\
409
+ //
410
+
411
+ //////////////////////////////////////////////////////////////////////////////
412
+ //
413
+ // BOOST_COPYABLE_AND_MOVABLE
414
+ //
415
+ //////////////////////////////////////////////////////////////////////////////
416
+
417
+ #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
418
+ public:\
419
+ TYPE& operator=(TYPE &t)\
420
+ { this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;}\
421
+ public:\
422
+ operator ::boost::rv<TYPE>&() \
423
+ { return *static_cast< ::boost::rv<TYPE>* >(this); }\
424
+ operator const ::boost::rv<TYPE>&() const \
425
+ { return *static_cast<const ::boost::rv<TYPE>* >(this); }\
426
+ private:\
427
+ //
428
+
429
+ #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
430
+ public:\
431
+ operator ::boost::rv<TYPE>&() \
432
+ { return *static_cast< ::boost::rv<TYPE>* >(this); }\
433
+ operator const ::boost::rv<TYPE>&() const \
434
+ { return *static_cast<const ::boost::rv<TYPE>* >(this); }\
435
+ private:\
436
+ //
437
+
438
+ } //namespace boost
439
+
440
+ #else //BOOST_NO_RVALUE_REFERENCES
441
+
442
+ namespace boost{
443
+
444
+ //! By default this traits returns false. Classes with non-throwing move constructor
445
+ //! and assignment should specialize this trait to obtain some performance improvements.
446
+ template <class T>
447
+ struct has_nothrow_move
448
+ : public BOOST_MOVE_MPL_NS::integral_constant<bool, false>
449
+ {};
450
+
451
+ } // namespace boost{
452
+
453
+ #if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
454
+ #include <utility>
455
+
456
+ namespace boost{
457
+
458
+ using ::std::move;
459
+ using ::std::forward;
460
+ using ::std::move_backward;
461
+
462
+ } //namespace boost
463
+
464
+ #else //!BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
465
+
466
+ #include <boost/type_traits/remove_reference.hpp>
467
+
468
+ namespace boost {
469
+
470
+ //////////////////////////////////////////////////////////////////////////////
471
+ //
472
+ // move
473
+ //
474
+ //////////////////////////////////////////////////////////////////////////////
475
+
476
+ #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
477
+ //! This function provides a way to convert a reference into a rvalue reference
478
+ //! in compilers with rvalue references. For other compilers converts T & into
479
+ //! <i>::boost::rv<T> &</i> so that move emulation is activated.
480
+ template <class T>
481
+ rvalue_reference move (input_reference);
482
+
483
+ #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
484
+
485
+ //Old move approach, lvalues could bind to rvalue references
486
+ template <class T>
487
+ inline typename remove_reference<T>::type && move(T&& t)
488
+ { return t; }
489
+
490
+ #else //Old move
491
+
492
+ template <class T>
493
+ inline typename remove_reference<T>::type && move(T&& t)
494
+ { return static_cast<typename remove_reference<T>::type &&>(t); }
495
+
496
+ #endif //Old move
497
+
498
+ //////////////////////////////////////////////////////////////////////////////
499
+ //
500
+ // forward
501
+ //
502
+ //////////////////////////////////////////////////////////////////////////////
503
+
504
+
505
+ #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
506
+ //! This function provides limited form of forwarding that is usually enough for
507
+ //! in-place construction and avoids the exponential overloading necessary for
508
+ //! perfect forwarding in C++03.
509
+ //!
510
+ //! For compilers with rvalue references this function provides perfect forwarding.
511
+ //!
512
+ //! Otherwise:
513
+ //! * If input_reference binds to const ::boost::rv<T> & then it output_reference is
514
+ //! ::boost::rev<T> &
515
+ //!
516
+ //! * Else, input_reference is equal to output_reference is equal to input_reference.
517
+ template <class T> output_reference forward(input_reference);
518
+ #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
519
+
520
+ //Old move approach, lvalues could bind to rvalue references
521
+
522
+ template <class T>
523
+ inline T&& forward (typename BOOST_MOVE_MPL_NS::identity<T>::type&& t)
524
+ { return t; }
525
+
526
+ #else //Old move
527
+
528
+ //Implementation #5 from N2951, thanks to Howard Hinnant
529
+
530
+ template <class T, class U>
531
+ inline T&& forward(U&& t
532
+ , typename BOOST_MOVE_BOOST_NS::enable_if_c<
533
+ move_detail::is_lvalue_reference<T>::value ? move_detail::is_lvalue_reference<U>::value : true>::type * = 0/*
534
+ , typename BOOST_MOVE_BOOST_NS::enable_if_c<
535
+ move_detail::is_convertible
536
+ <typename remove_reference<U>::type*, typename remove_reference<T>::type*>::value>::type * = 0*/)
537
+ { return static_cast<T&&>(t); }
538
+
539
+ #endif //BOOST_MOVE_DOXYGEN_INVOKED
540
+
541
+ } //namespace boost {
542
+
543
+ #endif //#if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
544
+
545
+ //! This macro marks a type as movable but not copyable, disabling copy construction
546
+ //! and assignment. The user will need to write a move constructor/assignment as explained
547
+ //! in the documentation to fully write a movable but not copyable class.
548
+ #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
549
+ public:\
550
+ typedef int boost_move_emulation_t;\
551
+ private:\
552
+ TYPE(const TYPE &);\
553
+ TYPE& operator=(const TYPE &);\
554
+ //
555
+
556
+ //! This macro marks a type as copyable and movable.
557
+ //! The user will need to write a move constructor/assignment and a copy assignment
558
+ //! as explained in the documentation to fully write a copyable and movable class.
559
+ #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
560
+ //
561
+
562
+ #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
563
+ //
564
+
565
+ //!This macro is used to achieve portable syntax in move
566
+ //!constructors and assignments for classes marked as
567
+ //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE
568
+ #define BOOST_RV_REF(TYPE)\
569
+ TYPE && \
570
+ //
571
+
572
+ //!This macro is used to achieve portable syntax in copy
573
+ //!assignment for classes marked as BOOST_COPYABLE_AND_MOVABLE.
574
+ #define BOOST_COPY_ASSIGN_REF(TYPE)\
575
+ const TYPE & \
576
+ //
577
+
578
+ //! This macro is used to implement portable perfect forwarding
579
+ //! as explained in the documentation.
580
+ #define BOOST_FWD_REF(TYPE)\
581
+ TYPE && \
582
+ //
583
+
584
+
585
+ #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
586
+ /// @cond
587
+
588
+ #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
589
+ TYPE<ARG1, ARG2> && \
590
+ //
591
+
592
+ #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
593
+ TYPE<ARG1, ARG2, ARG3> && \
594
+ //
595
+
596
+ #define BOOST_COPY_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
597
+ const TYPE<ARG1, ARG2> & \
598
+ //
599
+
600
+ #define BOOST_COPY_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
601
+ TYPE<ARG1, ARG2, ARG3>& \
602
+ //
603
+
604
+ #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
605
+ const TYPE & \
606
+ //
607
+
608
+ /// @endcond
609
+
610
+ #endif //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
611
+
612
+ #endif //BOOST_NO_RVALUE_REFERENCES
613
+
614
+ namespace boost {
615
+
616
+ //////////////////////////////////////////////////////////////////////////////
617
+ //
618
+ // move_iterator
619
+ //
620
+ //////////////////////////////////////////////////////////////////////////////
621
+
622
+ //! Class template move_iterator is an iterator adaptor with the same behavior
623
+ //! as the underlying iterator except that its dereference operator implicitly
624
+ //! converts the value returned by the underlying iterator's dereference operator
625
+ //! to an rvalue reference. Some generic algorithms can be called with move
626
+ //! iterators to replace copying with moving.
627
+ template <class It>
628
+ class move_iterator
629
+ {
630
+ public:
631
+ typedef It iterator_type;
632
+ typedef typename std::iterator_traits<iterator_type>::value_type value_type;
633
+ #if !defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
634
+ typedef value_type && reference;
635
+ #else
636
+ typedef typename BOOST_MOVE_MPL_NS::if_
637
+ < ::boost::has_move_emulation_enabled<value_type>
638
+ , ::boost::rv<value_type>&
639
+ , value_type & >::type reference;
640
+ #endif
641
+ typedef It pointer;
642
+ typedef typename std::iterator_traits<iterator_type>::difference_type difference_type;
643
+ typedef typename std::iterator_traits<iterator_type>::iterator_category iterator_category;
644
+
645
+ move_iterator()
646
+ {}
647
+
648
+ explicit move_iterator(It i)
649
+ : m_it(i)
650
+ {}
651
+
652
+ template <class U>
653
+ move_iterator(const move_iterator<U>& u)
654
+ : m_it(u.base())
655
+ {}
656
+
657
+ iterator_type base() const
658
+ { return m_it; }
659
+
660
+ reference operator*() const
661
+ {
662
+ #if defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
663
+ return *m_it;
664
+ #else
665
+ return ::boost::move(*m_it);
666
+ #endif
667
+ }
668
+
669
+ pointer operator->() const
670
+ { return m_it; }
671
+
672
+ move_iterator& operator++()
673
+ { ++m_it; return *this; }
674
+
675
+ move_iterator<iterator_type> operator++(int)
676
+ { move_iterator<iterator_type> tmp(*this); ++(*this); return tmp; }
677
+
678
+ move_iterator& operator--()
679
+ { --m_it; return *this; }
680
+
681
+ move_iterator<iterator_type> operator--(int)
682
+ { move_iterator<iterator_type> tmp(*this); --(*this); return tmp; }
683
+
684
+ move_iterator<iterator_type> operator+ (difference_type n) const
685
+ { return move_iterator<iterator_type>(m_it + n); }
686
+
687
+ move_iterator& operator+=(difference_type n)
688
+ { m_it += n; return *this; }
689
+
690
+ move_iterator<iterator_type> operator- (difference_type n) const
691
+ { return move_iterator<iterator_type>(m_it - n); }
692
+
693
+ move_iterator& operator-=(difference_type n)
694
+ { m_it -= n; return *this; }
695
+
696
+ reference operator[](difference_type n) const
697
+ {
698
+ #if defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
699
+ return m_it[n];
700
+ #else
701
+ return ::boost::move(m_it[n]);
702
+ #endif
703
+ }
704
+
705
+ friend bool operator==(const move_iterator& x, const move_iterator& y)
706
+ { return x.base() == y.base(); }
707
+
708
+ friend bool operator!=(const move_iterator& x, const move_iterator& y)
709
+ { return x.base() != y.base(); }
710
+
711
+ friend bool operator< (const move_iterator& x, const move_iterator& y)
712
+ { return x.base() < y.base(); }
713
+
714
+ friend bool operator<=(const move_iterator& x, const move_iterator& y)
715
+ { return x.base() <= y.base(); }
716
+
717
+ friend bool operator> (const move_iterator& x, const move_iterator& y)
718
+ { return x.base() > y.base(); }
719
+
720
+ friend bool operator>=(const move_iterator& x, const move_iterator& y)
721
+ { return x.base() >= y.base(); }
722
+
723
+ friend difference_type operator-(const move_iterator& x, const move_iterator& y)
724
+ { return x.base() - y.base(); }
725
+
726
+ friend move_iterator operator+(difference_type n, const move_iterator& x)
727
+ { return move_iterator(x.base() + n); }
728
+
729
+ private:
730
+ It m_it;
731
+ };
732
+
733
+
734
+ //is_move_iterator
735
+ namespace move_detail {
736
+
737
+ template <class I>
738
+ struct is_move_iterator
739
+ : public BOOST_MOVE_BOOST_NS::integral_constant<bool, false>
740
+ {
741
+ };
742
+
743
+ template <class I>
744
+ struct is_move_iterator< ::boost::move_iterator<I> >
745
+ : public BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
746
+ {
747
+ };
748
+
749
+ } //namespace move_detail {
750
+
751
+ //////////////////////////////////////////////////////////////////////////////
752
+ //
753
+ // move_iterator
754
+ //
755
+ //////////////////////////////////////////////////////////////////////////////
756
+
757
+ //!
758
+ //! <b>Returns</b>: move_iterator<It>(i).
759
+ template<class It>
760
+ inline move_iterator<It> make_move_iterator(const It &it)
761
+ { return move_iterator<It>(it); }
762
+
763
+ //////////////////////////////////////////////////////////////////////////////
764
+ //
765
+ // back_move_insert_iterator
766
+ //
767
+ //////////////////////////////////////////////////////////////////////////////
768
+
769
+
770
+ //! A move insert iterator that move constructs elements at the
771
+ //! back of a container
772
+ template <typename C> // C models Container
773
+ class back_move_insert_iterator
774
+ : public std::iterator<std::output_iterator_tag, void, void, void, void>
775
+ {
776
+ C* container_m;
777
+
778
+ public:
779
+ typedef C container_type;
780
+
781
+ explicit back_move_insert_iterator(C& x) : container_m(&x) { }
782
+
783
+ back_move_insert_iterator& operator=(typename C::reference x)
784
+ { container_m->push_back(boost::move(x)); return *this; }
785
+
786
+ back_move_insert_iterator& operator*() { return *this; }
787
+ back_move_insert_iterator& operator++() { return *this; }
788
+ back_move_insert_iterator& operator++(int) { return *this; }
789
+ };
790
+
791
+ //!
792
+ //! <b>Returns</b>: back_move_insert_iterator<C>(x).
793
+ template <typename C> // C models Container
794
+ inline back_move_insert_iterator<C> back_move_inserter(C& x)
795
+ {
796
+ return back_move_insert_iterator<C>(x);
797
+ }
798
+
799
+ //////////////////////////////////////////////////////////////////////////////
800
+ //
801
+ // front_move_insert_iterator
802
+ //
803
+ //////////////////////////////////////////////////////////////////////////////
804
+
805
+ //! A move insert iterator that move constructs elements int the
806
+ //! front of a container
807
+ template <typename C> // C models Container
808
+ class front_move_insert_iterator
809
+ : public std::iterator<std::output_iterator_tag, void, void, void, void>
810
+ {
811
+ C* container_m;
812
+
813
+ public:
814
+ typedef C container_type;
815
+
816
+ explicit front_move_insert_iterator(C& x) : container_m(&x) { }
817
+
818
+ front_move_insert_iterator& operator=(typename C::reference x)
819
+ { container_m->push_front(boost::move(x)); return *this; }
820
+
821
+ front_move_insert_iterator& operator*() { return *this; }
822
+ front_move_insert_iterator& operator++() { return *this; }
823
+ front_move_insert_iterator& operator++(int) { return *this; }
824
+ };
825
+
826
+ //!
827
+ //! <b>Returns</b>: front_move_insert_iterator<C>(x).
828
+ template <typename C> // C models Container
829
+ inline front_move_insert_iterator<C> front_move_inserter(C& x)
830
+ {
831
+ return front_move_insert_iterator<C>(x);
832
+ }
833
+
834
+ //////////////////////////////////////////////////////////////////////////////
835
+ //
836
+ // insert_move_iterator
837
+ //
838
+ //////////////////////////////////////////////////////////////////////////////
839
+ template <typename C> // C models Container
840
+ class move_insert_iterator
841
+ : public std::iterator<std::output_iterator_tag, void, void, void, void>
842
+ {
843
+ C* container_m;
844
+ typename C::iterator pos_;
845
+
846
+ public:
847
+ typedef C container_type;
848
+
849
+ explicit move_insert_iterator(C& x, typename C::iterator pos)
850
+ : container_m(&x), pos_(pos)
851
+ {}
852
+
853
+ move_insert_iterator& operator=(typename C::reference x)
854
+ {
855
+ pos_ = container_m->insert(pos_, ::boost::move(x));
856
+ ++pos_;
857
+ return *this;
858
+ }
859
+
860
+ move_insert_iterator& operator*() { return *this; }
861
+ move_insert_iterator& operator++() { return *this; }
862
+ move_insert_iterator& operator++(int) { return *this; }
863
+ };
864
+
865
+ //!
866
+ //! <b>Returns</b>: move_insert_iterator<C>(x, it).
867
+ template <typename C> // C models Container
868
+ inline move_insert_iterator<C> move_inserter(C& x, typename C::iterator it)
869
+ {
870
+ return move_insert_iterator<C>(x, it);
871
+ }
872
+
873
+ //////////////////////////////////////////////////////////////////////////////
874
+ //
875
+ // move
876
+ //
877
+ //////////////////////////////////////////////////////////////////////////////
878
+
879
+ #if !defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
880
+
881
+ //! <b>Effects</b>: Moves elements in the range [first,last) into the range [result,result + (last -
882
+ //! first)) starting from first and proceeding to last. For each non-negative integer n < (last-first),
883
+ //! performs *(result + n) = ::boost::move (*(first + n)).
884
+ //!
885
+ //! <b>Effects</b>: result + (last - first).
886
+ //!
887
+ //! <b>Requires</b>: result shall not be in the range [first,last).
888
+ //!
889
+ //! <b>Complexity</b>: Exactly last - first move assignments.
890
+ template <typename I, // I models InputIterator
891
+ typename O> // O models OutputIterator
892
+ O move(I f, I l, O result)
893
+ {
894
+ while (f != l) {
895
+ *result = ::boost::move(*f);
896
+ ++f; ++result;
897
+ }
898
+ return result;
899
+ }
900
+
901
+ //////////////////////////////////////////////////////////////////////////////
902
+ //
903
+ // move_backward
904
+ //
905
+ //////////////////////////////////////////////////////////////////////////////
906
+
907
+ //! <b>Effects</b>: Moves elements in the range [first,last) into the range
908
+ //! [result - (last-first),result) starting from last - 1 and proceeding to
909
+ //! first. For each positive integer n <= (last - first),
910
+ //! performs *(result - n) = ::boost::move(*(last - n)).
911
+ //!
912
+ //! <b>Requires</b>: result shall not be in the range [first,last).
913
+ //!
914
+ //! <b>Returns</b>: result - (last - first).
915
+ //!
916
+ //! <b>Complexity</b>: Exactly last - first assignments.
917
+ template <typename I, // I models BidirectionalIterator
918
+ typename O> // O models BidirectionalIterator
919
+ O move_backward(I f, I l, O result)
920
+ {
921
+ while (f != l) {
922
+ --l; --result;
923
+ *result = ::boost::move(*l);
924
+ }
925
+ return result;
926
+ }
927
+
928
+ #endif //!defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
929
+
930
+ //////////////////////////////////////////////////////////////////////////////
931
+ //
932
+ // uninitialized_move
933
+ //
934
+ //////////////////////////////////////////////////////////////////////////////
935
+
936
+ //! <b>Effects</b>:
937
+ //! \code
938
+ //! for (; first != last; ++result, ++first)
939
+ //! new (static_cast<void*>(&*result))
940
+ //! typename iterator_traits<ForwardIterator>::value_type(boost::move(*first));
941
+ //! \endcode
942
+ //!
943
+ //! <b>Returns</b>: result
944
+ template
945
+ <typename I, // I models InputIterator
946
+ typename F> // F models ForwardIterator
947
+ F uninitialized_move(I f, I l, F r
948
+ /// @cond
949
+ // ,typename BOOST_MOVE_BOOST_NS::enable_if<has_move_emulation_enabled<typename std::iterator_traits<I>::value_type> >::type* = 0
950
+ /// @endcond
951
+ )
952
+ {
953
+ typedef typename std::iterator_traits<I>::value_type input_value_type;
954
+ while (f != l) {
955
+ ::new(static_cast<void*>(&*r)) input_value_type(boost::move(*f));
956
+ ++f; ++r;
957
+ }
958
+ return r;
959
+ }
960
+
961
+ /// @cond
962
+ /*
963
+ template
964
+ <typename I, // I models InputIterator
965
+ typename F> // F models ForwardIterator
966
+ F uninitialized_move(I f, I l, F r,
967
+ typename BOOST_MOVE_BOOST_NS::disable_if<has_move_emulation_enabled<typename std::iterator_traits<I>::value_type> >::type* = 0)
968
+ {
969
+ return std::uninitialized_copy(f, l, r);
970
+ }
971
+ */
972
+
973
+ //////////////////////////////////////////////////////////////////////////////
974
+ //
975
+ // uninitialized_copy_or_move
976
+ //
977
+ //////////////////////////////////////////////////////////////////////////////
978
+
979
+ namespace move_detail {
980
+
981
+ template
982
+ <typename I, // I models InputIterator
983
+ typename F> // F models ForwardIterator
984
+ inline F uninitialized_move_move_iterator(I f, I l, F r
985
+ // ,typename BOOST_MOVE_BOOST_NS::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
986
+ )
987
+ {
988
+ return ::boost::uninitialized_move(f, l, r);
989
+ }
990
+ /*
991
+ template
992
+ <typename I, // I models InputIterator
993
+ typename F> // F models ForwardIterator
994
+ F uninitialized_move_move_iterator(I f, I l, F r,
995
+ typename BOOST_MOVE_BOOST_NS::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
996
+ {
997
+ return std::uninitialized_copy(f.base(), l.base(), r);
998
+ }
999
+ */
1000
+ } //namespace move_detail {
1001
+
1002
+ template
1003
+ <typename I, // I models InputIterator
1004
+ typename F> // F models ForwardIterator
1005
+ inline F uninitialized_copy_or_move(I f, I l, F r,
1006
+ typename BOOST_MOVE_BOOST_NS::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
1007
+ {
1008
+ return ::boost::move_detail::uninitialized_move_move_iterator(f, l, r);
1009
+ }
1010
+
1011
+ //////////////////////////////////////////////////////////////////////////////
1012
+ //
1013
+ // copy_or_move
1014
+ //
1015
+ //////////////////////////////////////////////////////////////////////////////
1016
+
1017
+ namespace move_detail {
1018
+
1019
+ template
1020
+ <typename I, // I models InputIterator
1021
+ typename F> // F models ForwardIterator
1022
+ inline F move_move_iterator(I f, I l, F r
1023
+ // ,typename BOOST_MOVE_BOOST_NS::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
1024
+ )
1025
+ {
1026
+ return ::boost::move(f, l, r);
1027
+ }
1028
+ /*
1029
+ template
1030
+ <typename I, // I models InputIterator
1031
+ typename F> // F models ForwardIterator
1032
+ F move_move_iterator(I f, I l, F r,
1033
+ typename BOOST_MOVE_BOOST_NS::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
1034
+ {
1035
+ return std::copy(f.base(), l.base(), r);
1036
+ }
1037
+ */
1038
+
1039
+ } //namespace move_detail {
1040
+
1041
+ template
1042
+ <typename I, // I models InputIterator
1043
+ typename F> // F models ForwardIterator
1044
+ inline F copy_or_move(I f, I l, F r,
1045
+ typename BOOST_MOVE_BOOST_NS::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
1046
+ {
1047
+ return ::boost::move_detail::move_move_iterator(f, l, r);
1048
+ }
1049
+
1050
+ /// @endcond
1051
+
1052
+ //! <b>Effects</b>:
1053
+ //! \code
1054
+ //! for (; first != last; ++result, ++first)
1055
+ //! new (static_cast<void*>(&*result))
1056
+ //! typename iterator_traits<ForwardIterator>::value_type(*first);
1057
+ //! \endcode
1058
+ //!
1059
+ //! <b>Returns</b>: result
1060
+ //!
1061
+ //! <b>Note</b>: This function is provided because
1062
+ //! <i>std::uninitialized_copy</i> from some STL implementations
1063
+ //! is not compatible with <i>move_iterator</i>
1064
+ template
1065
+ <typename I, // I models InputIterator
1066
+ typename F> // F models ForwardIterator
1067
+ inline F uninitialized_copy_or_move(I f, I l, F r
1068
+ /// @cond
1069
+ ,typename BOOST_MOVE_BOOST_NS::disable_if< move_detail::is_move_iterator<I> >::type* = 0
1070
+ /// @endcond
1071
+ )
1072
+ {
1073
+ return std::uninitialized_copy(f, l, r);
1074
+ }
1075
+
1076
+ //! <b>Effects</b>:
1077
+ //! \code
1078
+ //! for (; first != last; ++result, ++first)
1079
+ //! *result = *first;
1080
+ //! \endcode
1081
+ //!
1082
+ //! <b>Returns</b>: result
1083
+ //!
1084
+ //! <b>Note</b>: This function is provided because
1085
+ //! <i>std::uninitialized_copy</i> from some STL implementations
1086
+ //! is not compatible with <i>move_iterator</i>
1087
+ template
1088
+ <typename I, // I models InputIterator
1089
+ typename F> // F models ForwardIterator
1090
+ inline F copy_or_move(I f, I l, F r
1091
+ /// @cond
1092
+ ,typename BOOST_MOVE_BOOST_NS::disable_if< move_detail::is_move_iterator<I> >::type* = 0
1093
+ /// @endcond
1094
+ )
1095
+ {
1096
+ return std::copy(f, l, r);
1097
+ }
1098
+
1099
+ //! If this trait yields to true
1100
+ //! (<i>has_trivial_destructor_after_move &lt;T&gt;::value == true</i>)
1101
+ //! means that if T is used as argument of a move construction/assignment,
1102
+ //! there is no need to call T's destructor.
1103
+ //! This optimization tipically is used to improve containers' performance.
1104
+ //!
1105
+ //! By default this trait is true if the type has trivial destructor,
1106
+ //! every class should specialize this trait if it wants to improve performance
1107
+ //! when inserted in containers.
1108
+ template <class T>
1109
+ struct has_trivial_destructor_after_move
1110
+ : BOOST_MOVE_BOOST_NS::has_trivial_destructor<T>
1111
+ {};
1112
+
1113
+
1114
+
1115
+ namespace move_detail {
1116
+
1117
+ // Code from Jeffrey Lee Hellrung, many thanks
1118
+
1119
+ #ifndef BOOST_NO_RVALUE_REFERENCES
1120
+ template< class T> struct forward_type { typedef T type; };
1121
+ #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1122
+ template< class T>
1123
+ struct forward_type
1124
+ { typedef const T &type; };
1125
+
1126
+ template< class T>
1127
+ struct forward_type< boost::rv<T> >
1128
+ { typedef T type; };
1129
+ #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1130
+
1131
+
1132
+
1133
+ // Code from Jeffrey Lee Hellrung, many thanks
1134
+
1135
+ template< class T > struct is_rvalue_reference : BOOST_MOVE_BOOST_NS::integral_constant<bool, false> { };
1136
+ #ifndef BOOST_NO_RVALUE_REFERENCES
1137
+ template< class T > struct is_rvalue_reference< T&& > : BOOST_MOVE_BOOST_NS::integral_constant<bool, true> { };
1138
+ #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1139
+ template< class T > struct is_rvalue_reference< boost::rv<T>& >
1140
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
1141
+ {};
1142
+
1143
+ template< class T > struct is_rvalue_reference< const boost::rv<T>& >
1144
+ : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
1145
+ {};
1146
+ #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1147
+
1148
+ #ifndef BOOST_NO_RVALUE_REFERENCES
1149
+ template< class T > struct add_rvalue_reference { typedef T&& type; };
1150
+ #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1151
+ namespace detail_add_rvalue_reference
1152
+ {
1153
+ template< class T
1154
+ , bool emulation = ::boost::has_move_emulation_enabled<T>::value
1155
+ , bool rv = ::boost::move_detail::is_rv<T>::value >
1156
+ struct add_rvalue_reference_impl { typedef T type; };
1157
+
1158
+ template< class T, bool emulation>
1159
+ struct add_rvalue_reference_impl< T, emulation, true > { typedef T & type; };
1160
+
1161
+ template< class T, bool rv >
1162
+ struct add_rvalue_reference_impl< T, true, rv > { typedef ::boost::rv<T>& type; };
1163
+ } // namespace detail_add_rvalue_reference
1164
+
1165
+ template< class T >
1166
+ struct add_rvalue_reference
1167
+ : detail_add_rvalue_reference::add_rvalue_reference_impl<T>
1168
+ { };
1169
+
1170
+ template< class T >
1171
+ struct add_rvalue_reference<T &>
1172
+ { typedef T & type; };
1173
+
1174
+ #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1175
+
1176
+ template< class T > struct remove_rvalue_reference { typedef T type; };
1177
+
1178
+ #ifndef BOOST_NO_RVALUE_REFERENCES
1179
+ template< class T > struct remove_rvalue_reference< T&& > { typedef T type; };
1180
+ #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1181
+ template< class T > struct remove_rvalue_reference< rv<T> > { typedef T type; };
1182
+ template< class T > struct remove_rvalue_reference< const rv<T> > { typedef T type; };
1183
+ template< class T > struct remove_rvalue_reference< volatile rv<T> > { typedef T type; };
1184
+ template< class T > struct remove_rvalue_reference< const volatile rv<T> > { typedef T type; };
1185
+ template< class T > struct remove_rvalue_reference< rv<T>& > { typedef T type; };
1186
+ template< class T > struct remove_rvalue_reference< const rv<T>& > { typedef T type; };
1187
+ template< class T > struct remove_rvalue_reference< volatile rv<T>& > { typedef T type; };
1188
+ template< class T > struct remove_rvalue_reference< const volatile rv<T>& >{ typedef T type; };
1189
+ #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1190
+
1191
+ template <typename T>
1192
+ typename boost::move_detail::add_rvalue_reference<T>::type declval();
1193
+
1194
+ }
1195
+ // Ideas from Boost.Move review, Jeffrey Lee Hellrung:
1196
+ //
1197
+ //- TypeTraits metafunctions is_lvalue_reference, add_lvalue_reference, and remove_lvalue_reference ?
1198
+ // Perhaps add_reference and remove_reference can be modified so that they behave wrt emulated rvalue
1199
+ // references the same as wrt real rvalue references, i.e., add_reference< rv<T>& > -> T& rather than
1200
+ // rv<T>& (since T&& & -> T&).
1201
+ //
1202
+ //- Add'l TypeTraits has_[trivial_]move_{constructor,assign}...?
1203
+ //
1204
+ //- An as_lvalue(T& x) function, which amounts to an identity operation in C++0x, but strips emulated
1205
+ // rvalue references in C++03. This may be necessary to prevent "accidental moves".
1206
+
1207
+ } //namespace boost {
1208
+
1209
+ #if defined BOOST_MSVC
1210
+ #pragma warning (pop)
1211
+ #ifdef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
1212
+ #undef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
1213
+ #undef _CRT_SECURE_NO_DEPRECATE
1214
+ #endif
1215
+
1216
+ #ifdef BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
1217
+ #undef BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
1218
+ #undef _SCL_SECURE_NO_WARNINGS
1219
+ #endif
1220
+ #endif
1221
+
1222
+ #endif //#ifndef BOOST_MOVE_MOVE_HPP