passenger 4.0.20 → 4.0.21

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 (496) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.gitignore +1 -0
  5. data/.travis.yml +1 -1
  6. data/NEWS +15 -0
  7. data/README.md +5 -3
  8. data/Rakefile +1 -0
  9. data/bin/passenger-config +1 -5
  10. data/bin/passenger-install-apache2-module +53 -5
  11. data/bin/passenger-install-nginx-module +19 -6
  12. data/bin/passenger-memory-stats +3 -3
  13. data/build/agents.rb +11 -8
  14. data/build/apache2.rb +9 -5
  15. data/build/basics.rb +15 -21
  16. data/build/common_library.rb +16 -6
  17. data/build/cplusplus_support.rb +5 -5
  18. data/build/cxx_tests.rb +3 -3
  19. data/build/documentation.rb +1 -1
  20. data/build/misc.rb +4 -37
  21. data/build/node_tests.rb +29 -0
  22. data/build/oxt_tests.rb +1 -1
  23. data/build/packaging.rb +29 -10
  24. data/build/preprocessor.rb +2 -1
  25. data/build/test_basics.rb +15 -6
  26. data/debian.template/locations.ini.template +1 -0
  27. data/debian.template/passenger.install.template +1 -0
  28. data/dev/copy_boost_headers.rb +7 -3
  29. data/dev/run_travis.sh +32 -16
  30. data/doc/Users guide Apache.idmap.txt +22 -34
  31. data/doc/Users guide Apache.txt +20 -234
  32. data/doc/Users guide Nginx.idmap.txt +84 -66
  33. data/doc/Users guide Nginx.txt +50 -1
  34. data/doc/Users guide Standalone.idmap.txt +74 -0
  35. data/doc/Users guide Standalone.txt +22 -9
  36. data/doc/Users guide.txt +51 -0
  37. data/doc/users_guide_snippets/environment_variables.txt +0 -3
  38. data/doc/users_guide_snippets/installation.txt +337 -380
  39. data/doc/users_guide_snippets/installation/run_installer.txt +58 -0
  40. data/doc/users_guide_snippets/installation/verify_running_epilogue.txt +6 -0
  41. data/doc/users_guide_snippets/support_information.txt +2 -9
  42. data/doc/users_guide_snippets/troubleshooting/default.txt +112 -0
  43. data/doc/users_guide_snippets/troubleshooting/rails.txt +56 -0
  44. data/doc/users_guide_snippets/where_to_get_support.txt +9 -0
  45. data/ext/apache2/Bucket.h +1 -1
  46. data/ext/apache2/Configuration.hpp +0 -44
  47. data/ext/apache2/CreateDirConfig.cpp +1 -1
  48. data/ext/apache2/CreateDirConfig.cpp.erb +1 -1
  49. data/ext/apache2/Hooks.cpp +28 -21
  50. data/ext/apache2/MergeDirConfig.cpp +1 -0
  51. data/ext/apache2/MergeDirConfig.cpp.erb +1 -1
  52. data/ext/apache2/SetHeaders.cpp +73 -0
  53. data/ext/apache2/SetHeaders.cpp.erb +88 -0
  54. data/ext/boost/algorithm/string/detail/find_format.hpp +5 -5
  55. data/ext/boost/algorithm/string/detail/find_format_all.hpp +5 -5
  56. data/ext/boost/algorithm/string/detail/finder.hpp +1 -1
  57. data/ext/boost/algorithm/string/formatter.hpp +2 -2
  58. data/ext/boost/assert.hpp +6 -1
  59. data/ext/boost/atomic.hpp +18 -0
  60. data/ext/boost/atomic/atomic.hpp +241 -0
  61. data/ext/boost/atomic/detail/base.hpp +585 -0
  62. data/ext/boost/atomic/detail/cas32strong.hpp +885 -0
  63. data/ext/boost/atomic/detail/cas32weak.hpp +947 -0
  64. data/ext/boost/atomic/detail/cas64strong.hpp +443 -0
  65. data/ext/boost/atomic/detail/config.hpp +54 -0
  66. data/ext/boost/atomic/detail/gcc-alpha.hpp +368 -0
  67. data/ext/boost/atomic/detail/gcc-armv6plus.hpp +252 -0
  68. data/ext/boost/atomic/detail/gcc-cas.hpp +157 -0
  69. data/ext/boost/atomic/detail/gcc-ppc.hpp +2850 -0
  70. data/ext/boost/atomic/detail/gcc-sparcv9.hpp +1259 -0
  71. data/ext/boost/atomic/detail/gcc-x86.hpp +1766 -0
  72. data/ext/boost/atomic/detail/generic-cas.hpp +206 -0
  73. data/ext/boost/atomic/detail/interlocked.hpp +200 -0
  74. data/ext/boost/atomic/detail/linux-arm.hpp +189 -0
  75. data/ext/boost/atomic/detail/lockpool.hpp +97 -0
  76. data/ext/boost/atomic/detail/platform.hpp +62 -0
  77. data/ext/boost/atomic/detail/type-classification.hpp +45 -0
  78. data/ext/boost/chrono/config.hpp +8 -3
  79. data/ext/boost/chrono/duration.hpp +9 -10
  80. data/ext/boost/chrono/system_clocks.hpp +1 -1
  81. data/ext/boost/chrono/time_point.hpp +4 -3
  82. data/ext/boost/config/auto_link.hpp +53 -52
  83. data/ext/boost/config/compiler/borland.hpp +1 -0
  84. data/ext/boost/config/compiler/clang.hpp +24 -1
  85. data/ext/boost/config/compiler/codegear.hpp +1 -0
  86. data/ext/boost/config/compiler/common_edg.hpp +1 -0
  87. data/ext/boost/config/compiler/cray.hpp +1 -0
  88. data/ext/boost/config/compiler/digitalmars.hpp +1 -0
  89. data/ext/boost/config/compiler/gcc.hpp +29 -3
  90. data/ext/boost/config/compiler/gcc_xml.hpp +2 -1
  91. data/ext/boost/config/compiler/hp_acc.hpp +1 -0
  92. data/ext/boost/config/compiler/intel.hpp +1 -1
  93. data/ext/boost/config/compiler/metrowerks.hpp +1 -0
  94. data/ext/boost/config/compiler/mpw.hpp +1 -0
  95. data/ext/boost/config/compiler/pathscale.hpp +1 -0
  96. data/ext/boost/config/compiler/pgi.hpp +1 -0
  97. data/ext/boost/config/compiler/sunpro_cc.hpp +1 -0
  98. data/ext/boost/config/compiler/vacpp.hpp +3 -2
  99. data/ext/boost/config/compiler/visualc.hpp +25 -11
  100. data/ext/boost/config/platform/vxworks.hpp +353 -15
  101. data/ext/boost/config/select_compiler_config.hpp +4 -4
  102. data/ext/boost/config/stdlib/dinkumware.hpp +10 -3
  103. data/ext/boost/config/stdlib/libstdcpp3.hpp +2 -1
  104. data/ext/boost/config/suffix.hpp +45 -19
  105. data/ext/boost/date_time/format_date_parser.hpp +1 -11
  106. data/ext/boost/date_time/strings_from_facet.hpp +5 -3
  107. data/ext/boost/detail/atomic_redef_macros.hpp +19 -0
  108. data/ext/boost/detail/atomic_undef_macros.hpp +39 -0
  109. data/ext/boost/detail/endian.hpp +52 -4
  110. data/ext/boost/detail/scoped_enum_emulation.hpp +10 -10
  111. data/ext/boost/detail/select_type.hpp +36 -0
  112. data/ext/boost/exception/current_exception_cast.hpp +1 -1
  113. data/ext/boost/exception/detail/error_info_impl.hpp +3 -5
  114. data/ext/boost/exception/detail/exception_ptr.hpp +3 -3
  115. data/ext/boost/exception/detail/is_output_streamable.hpp +1 -1
  116. data/ext/boost/exception/detail/object_hex_dump.hpp +1 -1
  117. data/ext/boost/exception/detail/type_info.hpp +1 -1
  118. data/ext/boost/exception/diagnostic_information.hpp +15 -14
  119. data/ext/boost/exception/exception.hpp +1 -1
  120. data/ext/boost/exception/get_error_info.hpp +1 -1
  121. data/ext/boost/exception/info.hpp +12 -13
  122. data/ext/boost/exception/to_string.hpp +6 -1
  123. data/ext/boost/exception/to_string_stub.hpp +9 -1
  124. data/ext/boost/foreach.hpp +5 -5
  125. data/ext/boost/function/function_template.hpp +6 -6
  126. data/ext/boost/functional/hash/detail/float_functions.hpp +90 -0
  127. data/ext/boost/functional/hash/detail/hash_float.hpp +11 -2
  128. data/ext/boost/functional/hash/extensions.hpp +14 -2
  129. data/ext/boost/functional/hash/hash.hpp +26 -5
  130. data/ext/boost/get_pointer.hpp +17 -2
  131. data/ext/boost/integer_traits.hpp +1 -1
  132. data/ext/boost/lexical_cast.hpp +615 -395
  133. data/ext/boost/libs/atomic/lockpool.cpp +24 -0
  134. data/ext/boost/libs/system/src/error_code.cpp +25 -18
  135. data/ext/boost/libs/thread/src/future.cpp +7 -5
  136. data/ext/boost/libs/thread/src/pthread/once.cpp +9 -3
  137. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +90 -0
  138. data/ext/boost/libs/thread/src/pthread/thread.cpp +129 -95
  139. data/ext/boost/libs/thread/src/pthread/timeconv.inl +20 -1
  140. data/ext/boost/limits.hpp +1 -1
  141. data/ext/boost/math/policies/policy.hpp +10 -0
  142. data/ext/boost/math/special_functions/detail/round_fwd.hpp +17 -4
  143. data/ext/boost/math/special_functions/fpclassify.hpp +114 -45
  144. data/ext/boost/math/special_functions/math_fwd.hpp +195 -83
  145. data/ext/boost/math/special_functions/sign.hpp +13 -8
  146. data/ext/boost/math/tools/config.hpp +38 -16
  147. data/ext/boost/move/algorithm.hpp +275 -0
  148. data/ext/boost/move/core.hpp +332 -0
  149. data/ext/boost/move/detail/config_begin.hpp +23 -0
  150. data/ext/boost/move/detail/config_end.hpp +20 -0
  151. data/ext/boost/move/detail/meta_utils.hpp +158 -0
  152. data/ext/boost/move/iterator.hpp +298 -0
  153. data/ext/boost/move/move.hpp +10 -1256
  154. data/ext/boost/move/traits.hpp +142 -0
  155. data/ext/boost/move/utility.hpp +194 -0
  156. data/ext/boost/mpl/assert.hpp +72 -4
  157. data/ext/boost/noncopyable.hpp +15 -3
  158. data/ext/boost/pointer_to_other.hpp +55 -0
  159. data/ext/boost/range/concepts.hpp +4 -4
  160. data/ext/boost/range/detail/extract_optional_type.hpp +1 -1
  161. data/ext/boost/range/empty.hpp +1 -1
  162. data/ext/boost/range/iterator_range_core.hpp +4 -1
  163. data/ext/boost/range/iterator_range_io.hpp +2 -2
  164. data/ext/boost/ratio/config.hpp +6 -0
  165. data/ext/boost/ratio/detail/overflow_helpers.hpp +2 -2
  166. data/ext/boost/smart_ptr/allocate_shared_array.hpp +250 -0
  167. data/ext/boost/smart_ptr/detail/allocate_array_helper.hpp +169 -0
  168. data/ext/boost/smart_ptr/detail/array_deleter.hpp +124 -0
  169. data/ext/boost/smart_ptr/detail/array_traits.hpp +53 -0
  170. data/ext/boost/smart_ptr/detail/array_utility.hpp +178 -0
  171. data/ext/boost/smart_ptr/detail/make_array_helper.hpp +157 -0
  172. data/ext/boost/smart_ptr/detail/operator_bool.hpp +16 -9
  173. data/ext/boost/smart_ptr/detail/shared_count.hpp +78 -7
  174. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +15 -0
  175. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +12 -6
  176. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +1 -0
  177. data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +1 -0
  178. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +1 -0
  179. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +1 -0
  180. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +1 -0
  181. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +1 -0
  182. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +1 -0
  183. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +1 -0
  184. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +1 -0
  185. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +1 -0
  186. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +1 -0
  187. data/ext/boost/smart_ptr/detail/sp_counted_base_snc_ps3.hpp +162 -0
  188. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +1 -0
  189. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +1 -0
  190. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +1 -0
  191. data/ext/boost/smart_ptr/detail/sp_counted_base_vacpp_ppc.hpp +1 -0
  192. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +15 -0
  193. data/ext/boost/smart_ptr/detail/sp_forward.hpp +39 -0
  194. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +19 -3
  195. data/ext/boost/smart_ptr/detail/sp_if_array.hpp +31 -0
  196. data/ext/boost/smart_ptr/detail/sp_nullptr_t.hpp +45 -0
  197. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +5 -12
  198. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +4 -4
  199. data/ext/boost/smart_ptr/make_shared.hpp +5 -1060
  200. data/ext/boost/smart_ptr/make_shared_array.hpp +247 -0
  201. data/ext/boost/smart_ptr/make_shared_object.hpp +1128 -0
  202. data/ext/boost/smart_ptr/scoped_array.hpp +32 -7
  203. data/ext/boost/smart_ptr/scoped_ptr.hpp +31 -5
  204. data/ext/boost/smart_ptr/shared_array.hpp +135 -20
  205. data/ext/boost/smart_ptr/shared_ptr.hpp +444 -126
  206. data/ext/boost/smart_ptr/weak_ptr.hpp +39 -28
  207. data/ext/boost/static_assert.hpp +74 -17
  208. data/ext/boost/system/error_code.hpp +76 -68
  209. data/ext/boost/system/system_error.hpp +5 -1
  210. data/ext/boost/thread/barrier.hpp +6 -2
  211. data/ext/boost/thread/completion_latch.hpp +233 -0
  212. data/ext/boost/thread/condition.hpp +6 -1
  213. data/ext/boost/thread/detail/async_func.hpp +571 -0
  214. data/ext/boost/thread/detail/config.hpp +248 -40
  215. data/ext/boost/thread/detail/counter.hpp +93 -0
  216. data/ext/boost/thread/detail/delete.hpp +12 -0
  217. data/ext/boost/thread/detail/invoke.hpp +1351 -0
  218. data/ext/boost/thread/detail/is_convertible.hpp +48 -0
  219. data/ext/boost/thread/detail/lockable_wrapper.hpp +45 -0
  220. data/ext/boost/thread/detail/log.hpp +83 -0
  221. data/ext/boost/thread/detail/make_tuple_indices.hpp +224 -0
  222. data/ext/boost/thread/detail/move.hpp +32 -16
  223. data/ext/boost/thread/detail/thread.hpp +236 -41
  224. data/ext/boost/thread/detail/thread_group.hpp +55 -9
  225. data/ext/boost/thread/detail/thread_interruption.hpp +4 -1
  226. data/ext/boost/thread/exceptions.hpp +2 -0
  227. data/ext/boost/thread/externally_locked.hpp +351 -0
  228. data/ext/boost/thread/externally_locked_stream.hpp +170 -0
  229. data/ext/boost/thread/future.hpp +2517 -455
  230. data/ext/boost/thread/future_error_code.hpp +61 -0
  231. data/ext/boost/thread/is_locked_by_this_thread.hpp +39 -0
  232. data/ext/boost/thread/latch.hpp +142 -0
  233. data/ext/boost/thread/lock_algorithms.hpp +468 -0
  234. data/ext/boost/thread/lock_concepts.hpp +197 -0
  235. data/ext/boost/thread/lock_factories.hpp +78 -0
  236. data/ext/boost/thread/lock_guard.hpp +88 -0
  237. data/ext/boost/thread/lock_options.hpp +31 -0
  238. data/ext/boost/thread/lock_traits.hpp +45 -0
  239. data/ext/boost/thread/lock_types.hpp +1226 -0
  240. data/ext/boost/thread/lockable_adapter.hpp +226 -0
  241. data/ext/boost/thread/lockable_concepts.hpp +157 -0
  242. data/ext/boost/thread/lockable_traits.hpp +207 -0
  243. data/ext/boost/thread/locks.hpp +5 -1816
  244. data/ext/boost/thread/mutex.hpp +33 -1
  245. data/ext/boost/thread/null_mutex.hpp +243 -0
  246. data/ext/boost/thread/once.hpp +10 -1
  247. data/ext/boost/thread/poly_lockable.hpp +68 -0
  248. data/ext/boost/thread/poly_lockable_adapter.hpp +89 -0
  249. data/ext/boost/thread/poly_shared_lockable.hpp +135 -0
  250. data/ext/boost/thread/poly_shared_lockable_adapter.hpp +170 -0
  251. data/ext/boost/thread/pthread/condition_variable.hpp +74 -26
  252. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +54 -27
  253. data/ext/boost/thread/pthread/mutex.hpp +101 -38
  254. data/ext/boost/thread/pthread/once.hpp +459 -44
  255. data/ext/boost/thread/pthread/once_atomic.hpp +313 -0
  256. data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -10
  257. data/ext/boost/thread/pthread/shared_mutex.hpp +226 -61
  258. data/ext/boost/thread/pthread/shared_mutex_assert.hpp +724 -0
  259. data/ext/boost/thread/pthread/thread_data.hpp +53 -50
  260. data/ext/boost/thread/pthread/timespec.hpp +96 -12
  261. data/ext/boost/thread/recursive_mutex.hpp +44 -1
  262. data/ext/boost/thread/reverse_lock.hpp +3 -2
  263. data/ext/boost/thread/scoped_thread.hpp +285 -0
  264. data/ext/boost/thread/shared_lock_guard.hpp +2 -1
  265. data/ext/boost/thread/shared_mutex.hpp +23 -0
  266. data/ext/boost/thread/strict_lock.hpp +235 -0
  267. data/ext/boost/thread/sync_bounded_queue.hpp +594 -0
  268. data/ext/boost/thread/sync_queue.hpp +516 -0
  269. data/ext/boost/thread/synchronized_value.hpp +1001 -0
  270. data/ext/boost/thread/testable_mutex.hpp +148 -0
  271. data/ext/boost/thread/thread.hpp +1 -13
  272. data/ext/boost/thread/thread_functors.hpp +57 -0
  273. data/ext/boost/thread/thread_guard.hpp +46 -0
  274. data/ext/boost/thread/thread_only.hpp +29 -0
  275. data/ext/boost/thread/v2/shared_mutex.hpp +1062 -0
  276. data/ext/boost/thread/v2/thread.hpp +37 -10
  277. data/ext/boost/thread/xtime.hpp +2 -1
  278. data/ext/boost/token_functions.hpp +16 -16
  279. data/ext/boost/type_traits/add_lvalue_reference.hpp +26 -0
  280. data/ext/boost/type_traits/add_reference.hpp +1 -1
  281. data/ext/boost/type_traits/add_rvalue_reference.hpp +4 -4
  282. data/ext/boost/type_traits/aligned_storage.hpp +13 -0
  283. data/ext/boost/type_traits/common_type.hpp +11 -12
  284. data/ext/boost/type_traits/config.hpp +1 -1
  285. data/ext/boost/type_traits/detail/common_type_imp.hpp +1 -1
  286. data/ext/boost/type_traits/detail/has_binary_operator.hpp +1 -1
  287. data/ext/boost/type_traits/detail/is_function_ptr_tester.hpp +1 -1
  288. data/ext/boost/type_traits/has_left_shift.hpp +49 -0
  289. data/ext/boost/type_traits/has_right_shift.hpp +49 -0
  290. data/ext/boost/type_traits/has_trivial_move_assign.hpp +57 -0
  291. data/ext/boost/type_traits/has_trivial_move_constructor.hpp +57 -0
  292. data/ext/boost/type_traits/intrinsics.hpp +18 -2
  293. data/ext/boost/type_traits/is_abstract.hpp +1 -1
  294. data/ext/boost/type_traits/is_array.hpp +1 -1
  295. data/ext/boost/type_traits/is_const.hpp +1 -1
  296. data/ext/boost/type_traits/is_convertible.hpp +78 -17
  297. data/ext/boost/type_traits/is_function.hpp +6 -1
  298. data/ext/boost/type_traits/is_integral.hpp +6 -1
  299. data/ext/boost/type_traits/is_nothrow_move_assignable.hpp +84 -0
  300. data/ext/boost/type_traits/is_nothrow_move_constructible.hpp +84 -0
  301. data/ext/boost/type_traits/is_pod.hpp +3 -1
  302. data/ext/boost/type_traits/is_rvalue_reference.hpp +1 -1
  303. data/ext/boost/type_traits/is_volatile.hpp +1 -1
  304. data/ext/boost/type_traits/make_signed.hpp +153 -0
  305. data/ext/boost/type_traits/make_unsigned.hpp +16 -0
  306. data/ext/boost/type_traits/remove_const.hpp +1 -1
  307. data/ext/boost/type_traits/remove_cv.hpp +1 -1
  308. data/ext/boost/type_traits/remove_reference.hpp +1 -1
  309. data/ext/boost/type_traits/remove_volatile.hpp +1 -1
  310. data/ext/boost/unordered/detail/allocate.hpp +1120 -0
  311. data/ext/boost/unordered/detail/buckets.hpp +876 -0
  312. data/ext/boost/unordered/detail/equivalent.hpp +680 -0
  313. data/ext/boost/unordered/detail/extract_key.hpp +183 -0
  314. data/ext/boost/unordered/detail/fwd.hpp +23 -0
  315. data/ext/boost/unordered/detail/table.hpp +861 -0
  316. data/ext/boost/unordered/detail/unique.hpp +622 -0
  317. data/ext/boost/unordered/detail/util.hpp +260 -0
  318. data/ext/boost/unordered/unordered_map.hpp +1652 -0
  319. data/ext/boost/unordered/unordered_map_fwd.hpp +65 -0
  320. data/ext/boost/unordered/unordered_set.hpp +1549 -0
  321. data/ext/boost/unordered/unordered_set_fwd.hpp +63 -0
  322. data/ext/boost/unordered_map.hpp +18 -0
  323. data/ext/boost/unordered_set.hpp +18 -0
  324. data/ext/boost/utility/addressof.hpp +2 -2
  325. data/ext/boost/utility/result_of.hpp +8 -1
  326. data/ext/boost/version.hpp +2 -2
  327. data/ext/common/Account.h +1 -1
  328. data/ext/common/AccountsDatabase.h +1 -1
  329. data/ext/common/AgentsStarter.cpp +3 -1
  330. data/ext/common/AgentsStarter.h +2 -2
  331. data/ext/common/ApplicationPool2/AppTypes.cpp +24 -6
  332. data/ext/common/ApplicationPool2/AppTypes.h +17 -8
  333. data/ext/common/ApplicationPool2/Common.h +12 -12
  334. data/ext/common/ApplicationPool2/DirectSpawner.h +2 -2
  335. data/ext/common/ApplicationPool2/DummySpawner.h +3 -3
  336. data/ext/common/ApplicationPool2/Group.h +6 -6
  337. data/ext/common/ApplicationPool2/Implementation.cpp +19 -19
  338. data/ext/common/ApplicationPool2/PipeWatcher.h +5 -5
  339. data/ext/common/ApplicationPool2/Pool.h +21 -21
  340. data/ext/common/ApplicationPool2/Process.h +6 -6
  341. data/ext/common/ApplicationPool2/Session.h +1 -1
  342. data/ext/common/ApplicationPool2/SmartSpawner.h +24 -12
  343. data/ext/common/ApplicationPool2/Socket.h +2 -2
  344. data/ext/common/ApplicationPool2/Spawner.h +64 -14
  345. data/ext/common/ApplicationPool2/SpawnerFactory.h +7 -7
  346. data/ext/common/ApplicationPool2/SuperGroup.h +5 -5
  347. data/ext/common/BackgroundEventLoop.cpp +4 -4
  348. data/ext/common/BackgroundEventLoop.h +1 -1
  349. data/ext/common/Constants.h +13 -1
  350. data/ext/common/EventedBufferedInput.h +8 -8
  351. data/ext/common/Exceptions.cpp +71 -0
  352. data/ext/common/Exceptions.h +60 -7
  353. data/ext/common/FileDescriptor.h +4 -4
  354. data/ext/common/MessageClient.h +1 -1
  355. data/ext/common/MessageServer.h +5 -5
  356. data/ext/common/MultiLibeio.cpp +3 -3
  357. data/ext/common/MultiLibeio.h +2 -2
  358. data/ext/common/RandomGenerator.h +11 -11
  359. data/ext/common/ResourceLocator.h +8 -1
  360. data/ext/common/SafeLibev.h +12 -12
  361. data/ext/common/ServerInstanceDir.h +11 -3
  362. data/ext/common/UnionStation.h +10 -10
  363. data/ext/common/Utils.cpp +11 -13
  364. data/ext/common/Utils.h +9 -9
  365. data/ext/common/Utils/BlockingQueue.h +10 -10
  366. data/ext/common/Utils/BufferedIO.h +1 -1
  367. data/ext/common/Utils/CachedFileStat.hpp +2 -2
  368. data/ext/common/Utils/FileChangeChecker.h +1 -1
  369. data/ext/common/Utils/HashMap.h +13 -4
  370. data/ext/common/Utils/IOUtils.cpp +33 -10
  371. data/ext/common/Utils/IniFile.h +3 -3
  372. data/ext/common/Utils/Lock.h +2 -2
  373. data/ext/common/Utils/MessagePassing.h +10 -10
  374. data/ext/common/Utils/ProcessMetricsCollector.h +24 -6
  375. data/ext/common/Utils/ScopeGuard.h +5 -5
  376. data/ext/common/Utils/jsoncpp.cpp +2 -0
  377. data/ext/common/agents/HelperAgent/FileBackedPipe.h +26 -26
  378. data/ext/common/agents/HelperAgent/Main.cpp +18 -18
  379. data/ext/common/agents/HelperAgent/RequestHandler.cpp +4 -4
  380. data/ext/common/agents/HelperAgent/RequestHandler.h +30 -21
  381. data/ext/common/agents/LoggingAgent/AdminController.h +1 -1
  382. data/ext/common/agents/LoggingAgent/FilterSupport.h +13 -11
  383. data/ext/common/agents/LoggingAgent/LoggingServer.h +11 -11
  384. data/ext/common/agents/LoggingAgent/Main.cpp +9 -9
  385. data/ext/common/agents/LoggingAgent/RemoteSender.h +3 -3
  386. data/ext/common/agents/SpawnPreparer.cpp +1 -0
  387. data/ext/common/agents/Watchdog/AgentWatcher.cpp +8 -7
  388. data/ext/common/agents/Watchdog/Main.cpp +81 -73
  389. data/ext/common/agents/Watchdog/ServerInstanceDirToucher.cpp +1 -1
  390. data/ext/libev/Changes +57 -0
  391. data/ext/libev/LICENSE +2 -1
  392. data/ext/libev/Makefile.in +110 -50
  393. data/ext/libev/README +8 -8
  394. data/ext/libev/aclocal.m4 +1503 -861
  395. data/ext/libev/config.guess +290 -304
  396. data/ext/libev/config.sub +77 -198
  397. data/ext/libev/configure +1735 -890
  398. data/ext/libev/configure.ac +3 -2
  399. data/ext/libev/ev++.h +6 -6
  400. data/ext/libev/ev.c +541 -214
  401. data/ext/libev/ev.h +106 -100
  402. data/ext/libev/ev_epoll.c +1 -1
  403. data/ext/libev/ev_kqueue.c +20 -4
  404. data/ext/libev/ev_vars.h +15 -16
  405. data/ext/libev/ev_win32.c +12 -2
  406. data/ext/libev/ev_wrap.h +162 -160
  407. data/ext/libev/event.c +29 -6
  408. data/ext/libev/event.h +9 -2
  409. data/ext/libev/ltmain.sh +2632 -1384
  410. data/ext/nginx/ConfigurationCommands.c +1 -1
  411. data/ext/nginx/ConfigurationCommands.c.erb +3 -1
  412. data/ext/nginx/ContentHandler.c +25 -2
  413. data/ext/nginx/CreateLocationConfig.c +1 -0
  414. data/ext/nginx/CreateLocationConfig.c.erb +1 -1
  415. data/ext/nginx/MergeLocationConfig.c +1 -0
  416. data/ext/nginx/MergeLocationConfig.c.erb +1 -1
  417. data/ext/nginx/config +12 -0
  418. data/ext/oxt/dynamic_thread_group.hpp +7 -4
  419. data/ext/oxt/system_calls.cpp +5 -1
  420. data/ext/oxt/system_calls.hpp +3 -0
  421. data/helper-scripts/node-loader.js +117 -249
  422. data/lib/phusion_passenger.rb +27 -5
  423. data/lib/phusion_passenger/abstract_installer.rb +104 -9
  424. data/lib/phusion_passenger/admin_tools/memory_stats.rb +10 -9
  425. data/lib/phusion_passenger/apache2/config_options.rb +6 -3
  426. data/lib/phusion_passenger/common_library.rb +7 -1
  427. data/lib/phusion_passenger/constants.rb +6 -0
  428. data/lib/phusion_passenger/loader_shared_helpers.rb +7 -4
  429. data/lib/phusion_passenger/nginx/config_options.rb +2 -1
  430. data/lib/phusion_passenger/packaging.rb +3 -0
  431. data/lib/phusion_passenger/platform_info/apache.rb +43 -6
  432. data/lib/phusion_passenger/platform_info/apache_detector.rb +15 -5
  433. data/lib/phusion_passenger/platform_info/compiler.rb +167 -32
  434. data/lib/phusion_passenger/platform_info/cxx_portability.rb +133 -77
  435. data/lib/phusion_passenger/platform_info/depcheck.rb +17 -7
  436. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +3 -3
  437. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  438. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -6
  439. data/lib/phusion_passenger/platform_info/linux.rb +2 -1
  440. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  441. data/lib/phusion_passenger/platform_info/ruby.rb +18 -3
  442. data/lib/phusion_passenger/standalone/runtime_installer.rb +6 -2
  443. data/lib/phusion_passenger/standalone/start_command.rb +8 -2
  444. data/lib/phusion_passenger/utils/ansi_colors.rb +9 -0
  445. data/lib/phusion_passenger/utils/hosts_file_parser.rb +4 -2
  446. data/node_lib/phusion_passenger/httplib_emulation.js +141 -0
  447. data/node_lib/phusion_passenger/line_reader.js +154 -0
  448. data/node_lib/phusion_passenger/request_handler.js +65 -0
  449. data/node_lib/phusion_passenger/session_protocol_parser.js +113 -0
  450. data/resources/templates/apache2/deployment_example.txt.erb +2 -1
  451. data/resources/templates/apache2/installing_against_a_different_apache.txt.erb +14 -0
  452. data/resources/templates/apache2/multiple_apache_installations_detected.txt.erb +15 -0
  453. data/resources/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  454. data/resources/templates/general_error_with_html.html.template +1 -1
  455. data/resources/templates/installer_common/gem_install_permission_problems.txt.erb +17 -0
  456. data/resources/templates/installer_common/low_amount_of_memory_warning.txt.erb +6 -4
  457. data/resources/templates/installer_common/world_inaccessible_directories.txt.erb +16 -0
  458. data/resources/templates/nginx/deployment_example.txt.erb +2 -1
  459. data/resources/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +4 -5
  460. data/resources/templates/standalone/config.erb +1 -0
  461. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +3 -3
  462. data/test/cxx/ApplicationPool2/PoolTest.cpp +4 -4
  463. data/test/cxx/ApplicationPool2/ProcessTest.cpp +5 -5
  464. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +5 -5
  465. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +1 -1
  466. data/test/cxx/EventedBufferedInputTest.cpp +6 -6
  467. data/test/cxx/FileBackedPipeTest.cpp +1 -1
  468. data/test/cxx/MessagePassingTest.cpp +1 -1
  469. data/test/cxx/MessageServerTest.cpp +4 -4
  470. data/test/cxx/RequestHandlerTest.cpp +7 -7
  471. data/test/cxx/UnionStationTest.cpp +2 -2
  472. data/test/node/line_reader_spec.js +338 -0
  473. data/test/node/spec_helper.js +27 -0
  474. data/test/ruby/standalone/runtime_installer_spec.rb +2 -1
  475. metadata +131 -22
  476. metadata.gz.asc +7 -7
  477. data/ext/boost/functional/hash/detail/container_fwd_0x.hpp +0 -29
  478. data/ext/boost/lambda/core.hpp +0 -79
  479. data/ext/boost/lambda/detail/actions.hpp +0 -174
  480. data/ext/boost/lambda/detail/arity_code.hpp +0 -110
  481. data/ext/boost/lambda/detail/function_adaptors.hpp +0 -789
  482. data/ext/boost/lambda/detail/is_instance_of.hpp +0 -104
  483. data/ext/boost/lambda/detail/lambda_config.hpp +0 -48
  484. data/ext/boost/lambda/detail/lambda_functor_base.hpp +0 -615
  485. data/ext/boost/lambda/detail/lambda_functors.hpp +0 -324
  486. data/ext/boost/lambda/detail/lambda_fwd.hpp +0 -74
  487. data/ext/boost/lambda/detail/lambda_traits.hpp +0 -578
  488. data/ext/boost/lambda/detail/member_ptr.hpp +0 -737
  489. data/ext/boost/lambda/detail/operator_actions.hpp +0 -139
  490. data/ext/boost/lambda/detail/operator_lambda_func_base.hpp +0 -271
  491. data/ext/boost/lambda/detail/operator_return_type_traits.hpp +0 -917
  492. data/ext/boost/lambda/detail/operators.hpp +0 -370
  493. data/ext/boost/lambda/detail/ret.hpp +0 -325
  494. data/ext/boost/lambda/detail/return_type_traits.hpp +0 -282
  495. data/ext/boost/lambda/detail/select_functions.hpp +0 -74
  496. data/ext/boost/lambda/lambda.hpp +0 -34
@@ -1,7 +1,7 @@
1
1
  //////////////////////////////////////////////////////////////////////////////
2
2
  //
3
3
  // (C) Copyright David Abrahams, Vicente Botet 2009.
4
- // (C) Copyright Ion Gaztanaga 2009-2010.
4
+ // (C) Copyright Ion Gaztanaga 2009-2012.
5
5
  // Distributed under the Boost Software License, Version 1.0.
6
6
  // (See accompanying file LICENSE_1_0.txt or copy at
7
7
  // http://www.boost.org/LICENSE_1_0.txt)
@@ -10,1264 +10,18 @@
10
10
  //
11
11
  //////////////////////////////////////////////////////////////////////////////
12
12
 
13
- //! \file
13
+ //! \file move.hpp
14
+ //! A general library header that includes
15
+ //! the rest of top-level headers.
14
16
 
15
17
  #ifndef BOOST_MOVE_MOVE_HPP
16
18
  #define BOOST_MOVE_MOVE_HPP
17
19
 
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
- #if defined(__GNUC__) && (__GNUC__ >= 4)
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
- #define BOOST_RV_REF_BEG\
354
- ::boost::rv< \
355
- //
356
-
357
- #define BOOST_RV_REF_END\
358
- >& \
359
- //
360
-
361
-
362
-
363
- #define BOOST_FWD_REF(TYPE)\
364
- const TYPE & \
365
- //
366
-
367
- #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
368
- const ::boost::rv< TYPE >& \
369
- //
370
-
371
- #define BOOST_COPY_ASSIGN_REF(TYPE)\
372
- const ::boost::rv< TYPE >& \
373
- //
374
-
375
- #define BOOST_COPY_ASSIGN_REF_BEG \
376
- const ::boost::rv< \
377
- //
378
-
379
- #define BOOST_COPY_ASSIGN_REF_END \
380
- >& \
381
- //
382
-
383
- #define BOOST_MOVE_COPY_ASSIGN_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
384
- const ::boost::rv< TYPE<ARG1, ARG2> >& \
385
- //
386
-
387
- #define BOOST_MOVE_COPY_ASSIGN_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
388
- const ::boost::rv< TYPE<ARG1, ARG2, ARG3> >& \
389
- //
390
-
391
- //////////////////////////////////////////////////////////////////////////////
392
- //
393
- // forward()
394
- //
395
- //////////////////////////////////////////////////////////////////////////////
396
-
397
- template <class T>
398
- inline typename BOOST_MOVE_BOOST_NS::enable_if< ::boost::move_detail::is_rv<T>, T &>::type
399
- forward(const typename BOOST_MOVE_MPL_NS::identity<T>::type &x)
400
- {
401
- return const_cast<T&>(x);
402
- }
403
-
404
- template <class T>
405
- inline typename BOOST_MOVE_BOOST_NS::disable_if< ::boost::move_detail::is_rv<T>, const T &>::type
406
- forward(const typename BOOST_MOVE_MPL_NS::identity<T>::type &x)
407
- {
408
- return x;
409
- }
410
-
411
- //////////////////////////////////////////////////////////////////////////////
412
- //
413
- // BOOST_MOVABLE_BUT_NOT_COPYABLE
414
- //
415
- //////////////////////////////////////////////////////////////////////////////
416
- #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
417
- private:\
418
- TYPE(TYPE &);\
419
- TYPE& operator=(TYPE &);\
420
- public:\
421
- operator ::boost::rv<TYPE>&() \
422
- { return *static_cast< ::boost::rv<TYPE>* >(this); }\
423
- operator const ::boost::rv<TYPE>&() const \
424
- { return *static_cast<const ::boost::rv<TYPE>* >(this); }\
425
- private:\
426
- //
427
-
428
- //////////////////////////////////////////////////////////////////////////////
429
- //
430
- // BOOST_COPYABLE_AND_MOVABLE
431
- //
432
- //////////////////////////////////////////////////////////////////////////////
433
-
434
- #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
435
- public:\
436
- TYPE& operator=(TYPE &t)\
437
- { this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;}\
438
- public:\
439
- operator ::boost::rv<TYPE>&() \
440
- { return *static_cast< ::boost::rv<TYPE>* >(this); }\
441
- operator const ::boost::rv<TYPE>&() const \
442
- { return *static_cast<const ::boost::rv<TYPE>* >(this); }\
443
- private:\
444
- //
445
-
446
- #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
447
- public:\
448
- operator ::boost::rv<TYPE>&() \
449
- { return *static_cast< ::boost::rv<TYPE>* >(this); }\
450
- operator const ::boost::rv<TYPE>&() const \
451
- { return *static_cast<const ::boost::rv<TYPE>* >(this); }\
452
- private:\
453
- //
454
-
455
- } //namespace boost
456
-
457
- #else //BOOST_NO_RVALUE_REFERENCES
458
-
459
- namespace boost{
460
-
461
- //! By default this traits returns false. Classes with non-throwing move constructor
462
- //! and assignment should specialize this trait to obtain some performance improvements.
463
- template <class T>
464
- struct has_nothrow_move
465
- : public BOOST_MOVE_MPL_NS::integral_constant<bool, false>
466
- {};
467
-
468
- } // namespace boost{
469
-
470
- #if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
471
- #include <utility>
472
-
473
- namespace boost{
474
-
475
- using ::std::move;
476
- using ::std::forward;
477
- using ::std::move_backward;
478
-
479
- } //namespace boost
480
-
481
- #else //!BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE
482
-
483
- #include <boost/type_traits/remove_reference.hpp>
484
-
485
- namespace boost {
486
-
487
- //////////////////////////////////////////////////////////////////////////////
488
- //
489
- // move
490
- //
491
- //////////////////////////////////////////////////////////////////////////////
492
-
493
- #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
494
- //! This function provides a way to convert a reference into a rvalue reference
495
- //! in compilers with rvalue references. For other compilers converts T & into
496
- //! <i>::boost::rv<T> &</i> so that move emulation is activated.
497
- template <class T>
498
- rvalue_reference move (input_reference);
499
-
500
- #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
501
-
502
- //Old move approach, lvalues could bind to rvalue references
503
- template <class T>
504
- inline typename remove_reference<T>::type && move(T&& t)
505
- { return t; }
506
-
507
- #else //Old move
508
-
509
- template <class T>
510
- inline typename remove_reference<T>::type && move(T&& t)
511
- { return static_cast<typename remove_reference<T>::type &&>(t); }
512
-
513
- #endif //Old move
514
-
515
- //////////////////////////////////////////////////////////////////////////////
516
- //
517
- // forward
518
- //
519
- //////////////////////////////////////////////////////////////////////////////
520
-
521
-
522
- #if defined(BOOST_MOVE_DOXYGEN_INVOKED)
523
- //! This function provides limited form of forwarding that is usually enough for
524
- //! in-place construction and avoids the exponential overloading necessary for
525
- //! perfect forwarding in C++03.
526
- //!
527
- //! For compilers with rvalue references this function provides perfect forwarding.
528
- //!
529
- //! Otherwise:
530
- //! * If input_reference binds to const ::boost::rv<T> & then it output_reference is
531
- //! ::boost::rev<T> &
532
- //!
533
- //! * Else, input_reference is equal to output_reference is equal to input_reference.
534
- template <class T> output_reference forward(input_reference);
535
- #elif defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
536
-
537
- //Old move approach, lvalues could bind to rvalue references
538
-
539
- template <class T>
540
- inline T&& forward (typename BOOST_MOVE_MPL_NS::identity<T>::type&& t)
541
- { return t; }
542
-
543
- #else //Old move
544
-
545
- //Implementation #5 from N2951, thanks to Howard Hinnant
546
-
547
- template <class T, class U>
548
- inline T&& forward(U&& t
549
- , typename BOOST_MOVE_BOOST_NS::enable_if_c<
550
- move_detail::is_lvalue_reference<T>::value ? move_detail::is_lvalue_reference<U>::value : true>::type * = 0/*
551
- , typename BOOST_MOVE_BOOST_NS::enable_if_c<
552
- move_detail::is_convertible
553
- <typename remove_reference<U>::type*, typename remove_reference<T>::type*>::value>::type * = 0*/)
554
- { return static_cast<T&&>(t); }
555
-
556
- #endif //BOOST_MOVE_DOXYGEN_INVOKED
557
-
558
- } //namespace boost {
559
-
560
- #endif //#if defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
561
-
562
- //! This macro marks a type as movable but not copyable, disabling copy construction
563
- //! and assignment. The user will need to write a move constructor/assignment as explained
564
- //! in the documentation to fully write a movable but not copyable class.
565
- #define BOOST_MOVABLE_BUT_NOT_COPYABLE(TYPE)\
566
- public:\
567
- typedef int boost_move_emulation_t;\
568
- private:\
569
- TYPE(const TYPE &);\
570
- TYPE& operator=(const TYPE &);\
571
- //
572
-
573
- //! This macro marks a type as copyable and movable.
574
- //! The user will need to write a move constructor/assignment and a copy assignment
575
- //! as explained in the documentation to fully write a copyable and movable class.
576
- #define BOOST_COPYABLE_AND_MOVABLE(TYPE)\
577
- //
578
-
579
- #define BOOST_COPYABLE_AND_MOVABLE_ALT(TYPE)\
580
- //
581
-
582
- //!This macro is used to achieve portable syntax in move
583
- //!constructors and assignments for classes marked as
584
- //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE
585
- #define BOOST_RV_REF(TYPE)\
586
- TYPE && \
587
- //
588
-
589
- //!This macro is used to achieve portable syntax in move
590
- //!constructors and assignments for template classes marked as
591
- //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE.
592
- //!As macros have problem with comma-separatd template arguments,
593
- //!the template argument must be preceded with BOOST_RV_REF_START
594
- //!and ended with BOOST_RV_REF_END
595
- #define BOOST_RV_REF_BEG\
596
- \
597
- //
598
-
599
- //!This macro is used to achieve portable syntax in move
600
- //!constructors and assignments for template classes marked as
601
- //!BOOST_COPYABLE_AND_MOVABLE or BOOST_MOVABLE_BUT_NOT_COPYABLE.
602
- //!As macros have problem with comma-separatd template arguments,
603
- //!the template argument must be preceded with BOOST_RV_REF_START
604
- //!and ended with BOOST_RV_REF_END
605
- #define BOOST_RV_REF_END\
606
- && \
607
-
608
- //!This macro is used to achieve portable syntax in copy
609
- //!assignment for classes marked as BOOST_COPYABLE_AND_MOVABLE.
610
- #define BOOST_COPY_ASSIGN_REF(TYPE)\
611
- const TYPE & \
612
- //
613
-
614
- //! This macro is used to implement portable perfect forwarding
615
- //! as explained in the documentation.
616
- #define BOOST_FWD_REF(TYPE)\
617
- TYPE && \
618
- //
619
-
620
-
621
- #if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
622
- /// @cond
623
-
624
- #define BOOST_RV_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
625
- TYPE<ARG1, ARG2> && \
626
- //
627
-
628
- #define BOOST_RV_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
629
- TYPE<ARG1, ARG2, ARG3> && \
630
- //
631
-
632
- #define BOOST_COPY_REF_2_TEMPL_ARGS(TYPE, ARG1, ARG2)\
633
- const TYPE<ARG1, ARG2> & \
634
- //
635
-
636
- #define BOOST_COPY_REF_3_TEMPL_ARGS(TYPE, ARG1, ARG2, ARG3)\
637
- TYPE<ARG1, ARG2, ARG3>& \
638
- //
639
-
640
- #define BOOST_CATCH_CONST_RLVALUE(TYPE)\
641
- const TYPE & \
642
- //
643
-
644
- /// @endcond
645
-
646
- #endif //#if !defined(BOOST_MOVE_DOXYGEN_INVOKED)
647
-
648
- #endif //BOOST_NO_RVALUE_REFERENCES
649
-
650
- namespace boost {
651
-
652
- //////////////////////////////////////////////////////////////////////////////
653
- //
654
- // move_iterator
655
- //
656
- //////////////////////////////////////////////////////////////////////////////
657
-
658
- //! Class template move_iterator is an iterator adaptor with the same behavior
659
- //! as the underlying iterator except that its dereference operator implicitly
660
- //! converts the value returned by the underlying iterator's dereference operator
661
- //! to an rvalue reference. Some generic algorithms can be called with move
662
- //! iterators to replace copying with moving.
663
- template <class It>
664
- class move_iterator
665
- {
666
- public:
667
- typedef It iterator_type;
668
- typedef typename std::iterator_traits<iterator_type>::value_type value_type;
669
- #if !defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_MOVE_DOXYGEN_INVOKED)
670
- typedef value_type && reference;
671
- #else
672
- typedef typename BOOST_MOVE_MPL_NS::if_
673
- < ::boost::has_move_emulation_enabled<value_type>
674
- , ::boost::rv<value_type>&
675
- , value_type & >::type reference;
676
- #endif
677
- typedef It pointer;
678
- typedef typename std::iterator_traits<iterator_type>::difference_type difference_type;
679
- typedef typename std::iterator_traits<iterator_type>::iterator_category iterator_category;
680
-
681
- move_iterator()
682
- {}
683
-
684
- explicit move_iterator(It i)
685
- : m_it(i)
686
- {}
687
-
688
- template <class U>
689
- move_iterator(const move_iterator<U>& u)
690
- : m_it(u.base())
691
- {}
692
-
693
- iterator_type base() const
694
- { return m_it; }
695
-
696
- reference operator*() const
697
- {
698
- #if defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
699
- return *m_it;
700
- #else
701
- return ::boost::move(*m_it);
702
- #endif
703
- }
704
-
705
- pointer operator->() const
706
- { return m_it; }
707
-
708
- move_iterator& operator++()
709
- { ++m_it; return *this; }
710
-
711
- move_iterator<iterator_type> operator++(int)
712
- { move_iterator<iterator_type> tmp(*this); ++(*this); return tmp; }
713
-
714
- move_iterator& operator--()
715
- { --m_it; return *this; }
716
-
717
- move_iterator<iterator_type> operator--(int)
718
- { move_iterator<iterator_type> tmp(*this); --(*this); return tmp; }
719
-
720
- move_iterator<iterator_type> operator+ (difference_type n) const
721
- { return move_iterator<iterator_type>(m_it + n); }
722
-
723
- move_iterator& operator+=(difference_type n)
724
- { m_it += n; return *this; }
725
-
726
- move_iterator<iterator_type> operator- (difference_type n) const
727
- { return move_iterator<iterator_type>(m_it - n); }
728
-
729
- move_iterator& operator-=(difference_type n)
730
- { m_it -= n; return *this; }
731
-
732
- reference operator[](difference_type n) const
733
- {
734
- #if defined(BOOST_NO_RVALUE_REFERENCES) || defined(BOOST_MOVE_OLD_RVALUE_REF_BINDING_RULES)
735
- return m_it[n];
736
- #else
737
- return ::boost::move(m_it[n]);
738
- #endif
739
- }
740
-
741
- friend bool operator==(const move_iterator& x, const move_iterator& y)
742
- { return x.base() == y.base(); }
743
-
744
- friend bool operator!=(const move_iterator& x, const move_iterator& y)
745
- { return x.base() != y.base(); }
746
-
747
- friend bool operator< (const move_iterator& x, const move_iterator& y)
748
- { return x.base() < y.base(); }
749
-
750
- friend bool operator<=(const move_iterator& x, const move_iterator& y)
751
- { return x.base() <= y.base(); }
752
-
753
- friend bool operator> (const move_iterator& x, const move_iterator& y)
754
- { return x.base() > y.base(); }
755
-
756
- friend bool operator>=(const move_iterator& x, const move_iterator& y)
757
- { return x.base() >= y.base(); }
758
-
759
- friend difference_type operator-(const move_iterator& x, const move_iterator& y)
760
- { return x.base() - y.base(); }
761
-
762
- friend move_iterator operator+(difference_type n, const move_iterator& x)
763
- { return move_iterator(x.base() + n); }
764
-
765
- private:
766
- It m_it;
767
- };
768
-
769
-
770
- //is_move_iterator
771
- namespace move_detail {
772
-
773
- template <class I>
774
- struct is_move_iterator
775
- : public BOOST_MOVE_BOOST_NS::integral_constant<bool, false>
776
- {
777
- };
778
-
779
- template <class I>
780
- struct is_move_iterator< ::boost::move_iterator<I> >
781
- : public BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
782
- {
783
- };
784
-
785
- } //namespace move_detail {
786
-
787
- //////////////////////////////////////////////////////////////////////////////
788
- //
789
- // move_iterator
790
- //
791
- //////////////////////////////////////////////////////////////////////////////
792
-
793
- //!
794
- //! <b>Returns</b>: move_iterator<It>(i).
795
- template<class It>
796
- inline move_iterator<It> make_move_iterator(const It &it)
797
- { return move_iterator<It>(it); }
798
-
799
- //////////////////////////////////////////////////////////////////////////////
800
- //
801
- // back_move_insert_iterator
802
- //
803
- //////////////////////////////////////////////////////////////////////////////
804
-
805
-
806
- //! A move insert iterator that move constructs elements at the
807
- //! back of a container
808
- template <typename C> // C models Container
809
- class back_move_insert_iterator
810
- : public std::iterator<std::output_iterator_tag, void, void, void, void>
811
- {
812
- C* container_m;
813
-
814
- public:
815
- typedef C container_type;
816
- typedef typename C::value_type value_type;
817
- typedef typename C::reference reference;
818
-
819
- explicit back_move_insert_iterator(C& x) : container_m(&x) { }
820
-
821
- back_move_insert_iterator& operator=(reference x)
822
- { container_m->push_back(boost::move(x)); return *this; }
823
-
824
- back_move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
825
- { reference rx = x; return this->operator=(rx); }
826
-
827
- back_move_insert_iterator& operator*() { return *this; }
828
- back_move_insert_iterator& operator++() { return *this; }
829
- back_move_insert_iterator& operator++(int) { return *this; }
830
- };
831
-
832
- //!
833
- //! <b>Returns</b>: back_move_insert_iterator<C>(x).
834
- template <typename C> // C models Container
835
- inline back_move_insert_iterator<C> back_move_inserter(C& x)
836
- {
837
- return back_move_insert_iterator<C>(x);
838
- }
839
-
840
- //////////////////////////////////////////////////////////////////////////////
841
- //
842
- // front_move_insert_iterator
843
- //
844
- //////////////////////////////////////////////////////////////////////////////
845
-
846
- //! A move insert iterator that move constructs elements int the
847
- //! front of a container
848
- template <typename C> // C models Container
849
- class front_move_insert_iterator
850
- : public std::iterator<std::output_iterator_tag, void, void, void, void>
851
- {
852
- C* container_m;
853
-
854
- public:
855
- typedef C container_type;
856
- typedef typename C::value_type value_type;
857
- typedef typename C::reference reference;
858
-
859
- explicit front_move_insert_iterator(C& x) : container_m(&x) { }
860
-
861
- front_move_insert_iterator& operator=(reference x)
862
- { container_m->push_front(boost::move(x)); return *this; }
863
-
864
- front_move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
865
- { reference rx = x; return this->operator=(rx); }
866
-
867
- front_move_insert_iterator& operator*() { return *this; }
868
- front_move_insert_iterator& operator++() { return *this; }
869
- front_move_insert_iterator& operator++(int) { return *this; }
870
- };
871
-
872
- //!
873
- //! <b>Returns</b>: front_move_insert_iterator<C>(x).
874
- template <typename C> // C models Container
875
- inline front_move_insert_iterator<C> front_move_inserter(C& x)
876
- {
877
- return front_move_insert_iterator<C>(x);
878
- }
879
-
880
- //////////////////////////////////////////////////////////////////////////////
881
- //
882
- // insert_move_iterator
883
- //
884
- //////////////////////////////////////////////////////////////////////////////
885
- template <typename C> // C models Container
886
- class move_insert_iterator
887
- : public std::iterator<std::output_iterator_tag, void, void, void, void>
888
- {
889
- C* container_m;
890
- typename C::iterator pos_;
891
-
892
- public:
893
- typedef C container_type;
894
- typedef typename C::value_type value_type;
895
- typedef typename C::reference reference;
896
-
897
- explicit move_insert_iterator(C& x, typename C::iterator pos)
898
- : container_m(&x), pos_(pos)
899
- {}
900
-
901
- move_insert_iterator& operator=(reference x)
902
- {
903
- pos_ = container_m->insert(pos_, ::boost::move(x));
904
- ++pos_;
905
- return *this;
906
- }
907
-
908
- move_insert_iterator& operator=(BOOST_RV_REF(value_type) x)
909
- { reference rx = x; return this->operator=(rx); }
910
-
911
- move_insert_iterator& operator*() { return *this; }
912
- move_insert_iterator& operator++() { return *this; }
913
- move_insert_iterator& operator++(int) { return *this; }
914
- };
915
-
916
- //!
917
- //! <b>Returns</b>: move_insert_iterator<C>(x, it).
918
- template <typename C> // C models Container
919
- inline move_insert_iterator<C> move_inserter(C& x, typename C::iterator it)
920
- {
921
- return move_insert_iterator<C>(x, it);
922
- }
923
-
924
- //////////////////////////////////////////////////////////////////////////////
925
- //
926
- // move
927
- //
928
- //////////////////////////////////////////////////////////////////////////////
929
-
930
- #if !defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
931
-
932
- //! <b>Effects</b>: Moves elements in the range [first,last) into the range [result,result + (last -
933
- //! first)) starting from first and proceeding to last. For each non-negative integer n < (last-first),
934
- //! performs *(result + n) = ::boost::move (*(first + n)).
935
- //!
936
- //! <b>Effects</b>: result + (last - first).
937
- //!
938
- //! <b>Requires</b>: result shall not be in the range [first,last).
939
- //!
940
- //! <b>Complexity</b>: Exactly last - first move assignments.
941
- template <typename I, // I models InputIterator
942
- typename O> // O models OutputIterator
943
- O move(I f, I l, O result)
944
- {
945
- while (f != l) {
946
- *result = ::boost::move(*f);
947
- ++f; ++result;
948
- }
949
- return result;
950
- }
951
-
952
- //////////////////////////////////////////////////////////////////////////////
953
- //
954
- // move_backward
955
- //
956
- //////////////////////////////////////////////////////////////////////////////
957
-
958
- //! <b>Effects</b>: Moves elements in the range [first,last) into the range
959
- //! [result - (last-first),result) starting from last - 1 and proceeding to
960
- //! first. For each positive integer n <= (last - first),
961
- //! performs *(result - n) = ::boost::move(*(last - n)).
962
- //!
963
- //! <b>Requires</b>: result shall not be in the range [first,last).
964
- //!
965
- //! <b>Returns</b>: result - (last - first).
966
- //!
967
- //! <b>Complexity</b>: Exactly last - first assignments.
968
- template <typename I, // I models BidirectionalIterator
969
- typename O> // O models BidirectionalIterator
970
- O move_backward(I f, I l, O result)
971
- {
972
- while (f != l) {
973
- --l; --result;
974
- *result = ::boost::move(*l);
975
- }
976
- return result;
977
- }
978
-
979
- #endif //!defined(BOOST_MOVE_USE_STANDARD_LIBRARY_MOVE)
980
-
981
- //////////////////////////////////////////////////////////////////////////////
982
- //
983
- // uninitialized_move
984
- //
985
- //////////////////////////////////////////////////////////////////////////////
986
-
987
- //! <b>Effects</b>:
988
- //! \code
989
- //! for (; first != last; ++result, ++first)
990
- //! new (static_cast<void*>(&*result))
991
- //! typename iterator_traits<ForwardIterator>::value_type(boost::move(*first));
992
- //! \endcode
993
- //!
994
- //! <b>Returns</b>: result
995
- template
996
- <typename I, // I models InputIterator
997
- typename F> // F models ForwardIterator
998
- F uninitialized_move(I f, I l, F r
999
- /// @cond
1000
- // ,typename BOOST_MOVE_BOOST_NS::enable_if<has_move_emulation_enabled<typename std::iterator_traits<I>::value_type> >::type* = 0
1001
- /// @endcond
1002
- )
1003
- {
1004
- typedef typename std::iterator_traits<I>::value_type input_value_type;
1005
- while (f != l) {
1006
- ::new(static_cast<void*>(&*r)) input_value_type(boost::move(*f));
1007
- ++f; ++r;
1008
- }
1009
- return r;
1010
- }
1011
-
1012
- /// @cond
1013
- /*
1014
- template
1015
- <typename I, // I models InputIterator
1016
- typename F> // F models ForwardIterator
1017
- F uninitialized_move(I f, I l, F r,
1018
- typename BOOST_MOVE_BOOST_NS::disable_if<has_move_emulation_enabled<typename std::iterator_traits<I>::value_type> >::type* = 0)
1019
- {
1020
- return std::uninitialized_copy(f, l, r);
1021
- }
1022
- */
1023
-
1024
- //////////////////////////////////////////////////////////////////////////////
1025
- //
1026
- // uninitialized_copy_or_move
1027
- //
1028
- //////////////////////////////////////////////////////////////////////////////
1029
-
1030
- namespace move_detail {
1031
-
1032
- template
1033
- <typename I, // I models InputIterator
1034
- typename F> // F models ForwardIterator
1035
- inline F uninitialized_move_move_iterator(I f, I l, F r
1036
- // ,typename BOOST_MOVE_BOOST_NS::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
1037
- )
1038
- {
1039
- return ::boost::uninitialized_move(f, l, r);
1040
- }
1041
- /*
1042
- template
1043
- <typename I, // I models InputIterator
1044
- typename F> // F models ForwardIterator
1045
- F uninitialized_move_move_iterator(I f, I l, F r,
1046
- typename BOOST_MOVE_BOOST_NS::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
1047
- {
1048
- return std::uninitialized_copy(f.base(), l.base(), r);
1049
- }
1050
- */
1051
- } //namespace move_detail {
1052
-
1053
- template
1054
- <typename I, // I models InputIterator
1055
- typename F> // F models ForwardIterator
1056
- inline F uninitialized_copy_or_move(I f, I l, F r,
1057
- typename BOOST_MOVE_BOOST_NS::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
1058
- {
1059
- return ::boost::move_detail::uninitialized_move_move_iterator(f, l, r);
1060
- }
1061
-
1062
- //////////////////////////////////////////////////////////////////////////////
1063
- //
1064
- // copy_or_move
1065
- //
1066
- //////////////////////////////////////////////////////////////////////////////
1067
-
1068
- namespace move_detail {
1069
-
1070
- template
1071
- <typename I, // I models InputIterator
1072
- typename F> // F models ForwardIterator
1073
- inline F move_move_iterator(I f, I l, F r
1074
- // ,typename BOOST_MOVE_BOOST_NS::enable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0
1075
- )
1076
- {
1077
- return ::boost::move(f, l, r);
1078
- }
1079
- /*
1080
- template
1081
- <typename I, // I models InputIterator
1082
- typename F> // F models ForwardIterator
1083
- F move_move_iterator(I f, I l, F r,
1084
- typename BOOST_MOVE_BOOST_NS::disable_if< has_move_emulation_enabled<typename I::value_type> >::type* = 0)
1085
- {
1086
- return std::copy(f.base(), l.base(), r);
1087
- }
1088
- */
1089
-
1090
- } //namespace move_detail {
1091
-
1092
- template
1093
- <typename I, // I models InputIterator
1094
- typename F> // F models ForwardIterator
1095
- inline F copy_or_move(I f, I l, F r,
1096
- typename BOOST_MOVE_BOOST_NS::enable_if< move_detail::is_move_iterator<I> >::type* = 0)
1097
- {
1098
- return ::boost::move_detail::move_move_iterator(f, l, r);
1099
- }
1100
-
1101
- /// @endcond
1102
-
1103
- //! <b>Effects</b>:
1104
- //! \code
1105
- //! for (; first != last; ++result, ++first)
1106
- //! new (static_cast<void*>(&*result))
1107
- //! typename iterator_traits<ForwardIterator>::value_type(*first);
1108
- //! \endcode
1109
- //!
1110
- //! <b>Returns</b>: result
1111
- //!
1112
- //! <b>Note</b>: This function is provided because
1113
- //! <i>std::uninitialized_copy</i> from some STL implementations
1114
- //! is not compatible with <i>move_iterator</i>
1115
- template
1116
- <typename I, // I models InputIterator
1117
- typename F> // F models ForwardIterator
1118
- inline F uninitialized_copy_or_move(I f, I l, F r
1119
- /// @cond
1120
- ,typename BOOST_MOVE_BOOST_NS::disable_if< move_detail::is_move_iterator<I> >::type* = 0
1121
- /// @endcond
1122
- )
1123
- {
1124
- return std::uninitialized_copy(f, l, r);
1125
- }
1126
-
1127
- //! <b>Effects</b>:
1128
- //! \code
1129
- //! for (; first != last; ++result, ++first)
1130
- //! *result = *first;
1131
- //! \endcode
1132
- //!
1133
- //! <b>Returns</b>: result
1134
- //!
1135
- //! <b>Note</b>: This function is provided because
1136
- //! <i>std::uninitialized_copy</i> from some STL implementations
1137
- //! is not compatible with <i>move_iterator</i>
1138
- template
1139
- <typename I, // I models InputIterator
1140
- typename F> // F models ForwardIterator
1141
- inline F copy_or_move(I f, I l, F r
1142
- /// @cond
1143
- ,typename BOOST_MOVE_BOOST_NS::disable_if< move_detail::is_move_iterator<I> >::type* = 0
1144
- /// @endcond
1145
- )
1146
- {
1147
- return std::copy(f, l, r);
1148
- }
1149
-
1150
- //! If this trait yields to true
1151
- //! (<i>has_trivial_destructor_after_move &lt;T&gt;::value == true</i>)
1152
- //! means that if T is used as argument of a move construction/assignment,
1153
- //! there is no need to call T's destructor.
1154
- //! This optimization tipically is used to improve containers' performance.
1155
- //!
1156
- //! By default this trait is true if the type has trivial destructor,
1157
- //! every class should specialize this trait if it wants to improve performance
1158
- //! when inserted in containers.
1159
- template <class T>
1160
- struct has_trivial_destructor_after_move
1161
- : BOOST_MOVE_BOOST_NS::has_trivial_destructor<T>
1162
- {};
1163
-
1164
-
1165
-
1166
- namespace move_detail {
1167
-
1168
- // Code from Jeffrey Lee Hellrung, many thanks
1169
-
1170
- #ifndef BOOST_NO_RVALUE_REFERENCES
1171
- template< class T> struct forward_type { typedef T type; };
1172
- #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1173
- template< class T>
1174
- struct forward_type
1175
- { typedef const T &type; };
1176
-
1177
- template< class T>
1178
- struct forward_type< boost::rv<T> >
1179
- { typedef T type; };
1180
- #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1181
-
1182
-
1183
-
1184
- // Code from Jeffrey Lee Hellrung, many thanks
1185
-
1186
- template< class T > struct is_rvalue_reference : BOOST_MOVE_BOOST_NS::integral_constant<bool, false> { };
1187
- #ifndef BOOST_NO_RVALUE_REFERENCES
1188
- template< class T > struct is_rvalue_reference< T&& > : BOOST_MOVE_BOOST_NS::integral_constant<bool, true> { };
1189
- #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1190
- template< class T > struct is_rvalue_reference< boost::rv<T>& >
1191
- : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
1192
- {};
1193
-
1194
- template< class T > struct is_rvalue_reference< const boost::rv<T>& >
1195
- : BOOST_MOVE_BOOST_NS::integral_constant<bool, true>
1196
- {};
1197
- #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1198
-
1199
- #ifndef BOOST_NO_RVALUE_REFERENCES
1200
- template< class T > struct add_rvalue_reference { typedef T&& type; };
1201
- #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1202
- namespace detail_add_rvalue_reference
1203
- {
1204
- template< class T
1205
- , bool emulation = ::boost::has_move_emulation_enabled<T>::value
1206
- , bool rv = ::boost::move_detail::is_rv<T>::value >
1207
- struct add_rvalue_reference_impl { typedef T type; };
1208
-
1209
- template< class T, bool emulation>
1210
- struct add_rvalue_reference_impl< T, emulation, true > { typedef T & type; };
1211
-
1212
- template< class T, bool rv >
1213
- struct add_rvalue_reference_impl< T, true, rv > { typedef ::boost::rv<T>& type; };
1214
- } // namespace detail_add_rvalue_reference
1215
-
1216
- template< class T >
1217
- struct add_rvalue_reference
1218
- : detail_add_rvalue_reference::add_rvalue_reference_impl<T>
1219
- { };
1220
-
1221
- template< class T >
1222
- struct add_rvalue_reference<T &>
1223
- { typedef T & type; };
1224
-
1225
- #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1226
-
1227
- template< class T > struct remove_rvalue_reference { typedef T type; };
1228
-
1229
- #ifndef BOOST_NO_RVALUE_REFERENCES
1230
- template< class T > struct remove_rvalue_reference< T&& > { typedef T type; };
1231
- #else // #ifndef BOOST_NO_RVALUE_REFERENCES
1232
- template< class T > struct remove_rvalue_reference< rv<T> > { typedef T type; };
1233
- template< class T > struct remove_rvalue_reference< const rv<T> > { typedef T type; };
1234
- template< class T > struct remove_rvalue_reference< volatile rv<T> > { typedef T type; };
1235
- template< class T > struct remove_rvalue_reference< const volatile rv<T> > { typedef T type; };
1236
- template< class T > struct remove_rvalue_reference< rv<T>& > { typedef T type; };
1237
- template< class T > struct remove_rvalue_reference< const rv<T>& > { typedef T type; };
1238
- template< class T > struct remove_rvalue_reference< volatile rv<T>& > { typedef T type; };
1239
- template< class T > struct remove_rvalue_reference< const volatile rv<T>& >{ typedef T type; };
1240
- #endif // #ifndef BOOST_NO_RVALUE_REFERENCES
1241
-
1242
- template <typename T>
1243
- typename boost::move_detail::add_rvalue_reference<T>::type declval();
1244
-
1245
- }
1246
- // Ideas from Boost.Move review, Jeffrey Lee Hellrung:
1247
- //
1248
- //- TypeTraits metafunctions is_lvalue_reference, add_lvalue_reference, and remove_lvalue_reference ?
1249
- // Perhaps add_reference and remove_reference can be modified so that they behave wrt emulated rvalue
1250
- // references the same as wrt real rvalue references, i.e., add_reference< rv<T>& > -> T& rather than
1251
- // rv<T>& (since T&& & -> T&).
1252
- //
1253
- //- Add'l TypeTraits has_[trivial_]move_{constructor,assign}...?
1254
- //
1255
- //- An as_lvalue(T& x) function, which amounts to an identity operation in C++0x, but strips emulated
1256
- // rvalue references in C++03. This may be necessary to prevent "accidental moves".
1257
-
1258
- } //namespace boost {
1259
-
1260
- #if defined BOOST_MSVC
1261
- #pragma warning (pop)
1262
- #ifdef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
1263
- #undef BOOST_INTERPROCESS_CRT_SECURE_NO_DEPRECATE
1264
- #undef _CRT_SECURE_NO_DEPRECATE
1265
- #endif
1266
-
1267
- #ifdef BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
1268
- #undef BOOST_INTERPROCESS_SCL_SECURE_NO_WARNINGS
1269
- #undef _SCL_SECURE_NO_WARNINGS
1270
- #endif
1271
- #endif
20
+ #include <boost/move/detail/config_begin.hpp>
21
+ #include <boost/move/utility.hpp>
22
+ #include <boost/move/iterator.hpp>
23
+ #include <boost/move/traits.hpp>
24
+ #include <boost/move/algorithm.hpp>
25
+ #include <boost/move/detail/config_end.hpp>
1272
26
 
1273
27
  #endif //#ifndef BOOST_MOVE_MOVE_HPP