passenger 3.0.0 → 3.0.1

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 (538) hide show
  1. data/DEVELOPERS.TXT +9 -6
  2. data/NEWS +50 -0
  3. data/Rakefile +2 -1
  4. data/bin/passenger-install-apache2-module +4 -4
  5. data/bin/passenger-install-nginx-module +1 -1
  6. data/bin/passenger-make-enterprisey +1 -1
  7. data/build/agents.rb +26 -19
  8. data/build/apache2.rb +49 -46
  9. data/build/basics.rb +37 -13
  10. data/build/common_library.rb +134 -64
  11. data/build/config.rb +18 -11
  12. data/build/cplusplus_support.rb +4 -0
  13. data/build/cxx_tests.rb +26 -12
  14. data/build/documentation.rb +18 -11
  15. data/build/integration_tests.rb +18 -11
  16. data/build/misc.rb +18 -11
  17. data/build/nginx.rb +27 -19
  18. data/build/oxt_tests.rb +18 -11
  19. data/build/packaging.rb +45 -37
  20. data/build/rpm.rb +98 -0
  21. data/build/ruby_extension.rb +19 -13
  22. data/build/ruby_tests.rb +19 -12
  23. data/build/test_basics.rb +23 -11
  24. data/debian/README.Debian +15 -0
  25. data/debian/changelog +185 -0
  26. data/debian/control +47 -19
  27. data/debian/copyright +20 -0
  28. data/debian/libapache2-mod-passenger.install +1 -0
  29. data/debian/libapache2-mod-passenger.postinst +36 -0
  30. data/debian/libapache2-mod-passenger.prerm +15 -0
  31. data/debian/passenger-common.install +4 -0
  32. data/debian/passenger.conf +4 -0
  33. data/debian/passenger.load +1 -0
  34. data/debian/rules +37 -0
  35. data/debian/watch +3 -0
  36. data/{misc → dev}/copy_boost_headers.rb +3 -0
  37. data/{misc → dev}/find_owner_pipe_leaks.rb +0 -0
  38. data/{misc → dev}/render_error_pages.rb +0 -0
  39. data/doc/Users guide Apache.html +39 -1
  40. data/doc/Users guide Apache.txt +40 -0
  41. data/doc/Users guide Nginx.html +1 -1
  42. data/doc/Users guide Standalone.html +1 -1
  43. data/doc/cxxapi/Constants_8h_source.html +1 -1
  44. data/doc/cxxapi/DirectoryMapper_8h_source.html +6 -22
  45. data/doc/cxxapi/EventedClient_8h_source.html +572 -468
  46. data/doc/cxxapi/Exceptions_8h_source.html +142 -129
  47. data/doc/cxxapi/FileDescriptor_8h_source.html +263 -199
  48. data/doc/cxxapi/MessageChannel_8h_source.html +686 -770
  49. data/doc/cxxapi/MessageServer_8h_source.html +1 -1
  50. data/doc/cxxapi/PoolOptions_8h_source.html +79 -78
  51. data/doc/cxxapi/ResourceLocator_8h_source.html +105 -55
  52. data/doc/cxxapi/SafeLibev_8h_source.html +180 -0
  53. data/doc/cxxapi/ServerInstanceDir_8h_source.html +114 -110
  54. data/doc/cxxapi/Session_8h_source.html +1 -1
  55. data/doc/cxxapi/SpawnManager_8h_source.html +208 -208
  56. data/doc/cxxapi/StaticString_8h_source.html +258 -183
  57. data/doc/cxxapi/Utils_8h_source.html +71 -54
  58. data/doc/cxxapi/annotated.html +3 -0
  59. data/doc/cxxapi/classAgentWatcher.html +2 -2
  60. data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +0 -1
  61. data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +0 -27
  62. data/doc/cxxapi/classPassenger_1_1EventedClient-members.html +5 -0
  63. data/doc/cxxapi/classPassenger_1_1EventedClient.html +102 -7
  64. data/doc/cxxapi/classPassenger_1_1FileDescriptor-members.html +2 -1
  65. data/doc/cxxapi/classPassenger_1_1FileDescriptor.html +34 -8
  66. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair-members.html +36 -0
  67. data/doc/cxxapi/classPassenger_1_1FileDescriptorPair.html +52 -0
  68. data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +0 -3
  69. data/doc/cxxapi/classPassenger_1_1MessageChannel.html +0 -120
  70. data/doc/cxxapi/classPassenger_1_1SafeLibev-members.html +36 -0
  71. data/doc/cxxapi/classPassenger_1_1SafeLibev.html +51 -0
  72. data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -0
  73. data/doc/cxxapi/classPassenger_1_1SpawnException.html +22 -0
  74. data/doc/cxxapi/classes.html +14 -14
  75. data/doc/cxxapi/files.html +2 -0
  76. data/doc/cxxapi/functions_0x63.html +6 -3
  77. data/doc/cxxapi/functions_0x64.html +9 -2
  78. data/doc/cxxapi/functions_0x67.html +6 -9
  79. data/doc/cxxapi/functions_0x69.html +3 -0
  80. data/doc/cxxapi/functions_0x77.html +8 -8
  81. data/doc/cxxapi/functions_eval.html +6 -0
  82. data/doc/cxxapi/functions_func.html +18 -17
  83. data/doc/cxxapi/functions_vars.html +8 -0
  84. data/doc/cxxapi/graph_legend.png +0 -0
  85. data/doc/cxxapi/group__Core.png +0 -0
  86. data/doc/cxxapi/group__Hooks.png +0 -0
  87. data/doc/cxxapi/hierarchy.html +3 -0
  88. data/doc/cxxapi/inherit__graph__14.map +1 -1
  89. data/doc/cxxapi/inherit__graph__14.md5 +1 -1
  90. data/doc/cxxapi/inherit__graph__14.png +0 -0
  91. data/doc/cxxapi/inherit__graph__15.map +1 -3
  92. data/doc/cxxapi/inherit__graph__15.md5 +1 -1
  93. data/doc/cxxapi/inherit__graph__15.png +0 -0
  94. data/doc/cxxapi/inherit__graph__16.map +3 -1
  95. data/doc/cxxapi/inherit__graph__16.md5 +1 -1
  96. data/doc/cxxapi/inherit__graph__16.png +0 -0
  97. data/doc/cxxapi/inherit__graph__17.map +1 -1
  98. data/doc/cxxapi/inherit__graph__17.md5 +1 -1
  99. data/doc/cxxapi/inherit__graph__17.png +0 -0
  100. data/doc/cxxapi/inherit__graph__18.map +1 -2
  101. data/doc/cxxapi/inherit__graph__18.md5 +1 -1
  102. data/doc/cxxapi/inherit__graph__18.png +0 -0
  103. data/doc/cxxapi/inherit__graph__19.map +2 -1
  104. data/doc/cxxapi/inherit__graph__19.md5 +1 -1
  105. data/doc/cxxapi/inherit__graph__19.png +0 -0
  106. data/doc/cxxapi/inherit__graph__20.map +1 -1
  107. data/doc/cxxapi/inherit__graph__20.md5 +1 -1
  108. data/doc/cxxapi/inherit__graph__20.png +0 -0
  109. data/doc/cxxapi/inherit__graph__21.map +1 -1
  110. data/doc/cxxapi/inherit__graph__21.md5 +1 -1
  111. data/doc/cxxapi/inherit__graph__21.png +0 -0
  112. data/doc/cxxapi/inherit__graph__22.map +1 -1
  113. data/doc/cxxapi/inherit__graph__22.md5 +1 -1
  114. data/doc/cxxapi/inherit__graph__22.png +0 -0
  115. data/doc/cxxapi/inherit__graph__23.map +1 -1
  116. data/doc/cxxapi/inherit__graph__23.md5 +1 -1
  117. data/doc/cxxapi/inherit__graph__23.png +0 -0
  118. data/doc/cxxapi/inherit__graph__24.map +1 -1
  119. data/doc/cxxapi/inherit__graph__24.md5 +1 -1
  120. data/doc/cxxapi/inherit__graph__24.png +0 -0
  121. data/doc/cxxapi/inherit__graph__25.map +1 -1
  122. data/doc/cxxapi/inherit__graph__25.md5 +1 -1
  123. data/doc/cxxapi/inherit__graph__25.png +0 -0
  124. data/doc/cxxapi/inherit__graph__26.map +1 -1
  125. data/doc/cxxapi/inherit__graph__26.md5 +1 -1
  126. data/doc/cxxapi/inherit__graph__26.png +0 -0
  127. data/doc/cxxapi/inherit__graph__27.map +1 -1
  128. data/doc/cxxapi/inherit__graph__27.md5 +1 -1
  129. data/doc/cxxapi/inherit__graph__27.png +0 -0
  130. data/doc/cxxapi/inherit__graph__28.map +1 -2
  131. data/doc/cxxapi/inherit__graph__28.md5 +1 -1
  132. data/doc/cxxapi/inherit__graph__28.png +0 -0
  133. data/doc/cxxapi/inherit__graph__29.map +1 -1
  134. data/doc/cxxapi/inherit__graph__29.md5 +1 -1
  135. data/doc/cxxapi/inherit__graph__29.png +0 -0
  136. data/doc/cxxapi/inherit__graph__30.map +1 -1
  137. data/doc/cxxapi/inherit__graph__30.md5 +1 -1
  138. data/doc/cxxapi/inherit__graph__30.png +0 -0
  139. data/doc/cxxapi/inherit__graph__31.map +2 -1
  140. data/doc/cxxapi/inherit__graph__31.md5 +1 -1
  141. data/doc/cxxapi/inherit__graph__31.png +0 -0
  142. data/doc/cxxapi/inherit__graph__32.map +1 -3
  143. data/doc/cxxapi/inherit__graph__32.md5 +1 -1
  144. data/doc/cxxapi/inherit__graph__32.png +0 -0
  145. data/doc/cxxapi/inherit__graph__33.map +1 -1
  146. data/doc/cxxapi/inherit__graph__33.md5 +1 -1
  147. data/doc/cxxapi/inherit__graph__33.png +0 -0
  148. data/doc/cxxapi/inherit__graph__34.map +1 -1
  149. data/doc/cxxapi/inherit__graph__34.md5 +1 -1
  150. data/doc/cxxapi/inherit__graph__34.png +0 -0
  151. data/doc/cxxapi/inherit__graph__35.map +3 -1
  152. data/doc/cxxapi/inherit__graph__35.md5 +1 -1
  153. data/doc/cxxapi/inherit__graph__35.png +0 -0
  154. data/doc/cxxapi/inherit__graph__36.map +1 -1
  155. data/doc/cxxapi/inherit__graph__36.md5 +1 -1
  156. data/doc/cxxapi/inherit__graph__36.png +0 -0
  157. data/doc/cxxapi/inherit__graph__37.map +1 -1
  158. data/doc/cxxapi/inherit__graph__37.md5 +1 -1
  159. data/doc/cxxapi/inherit__graph__37.png +0 -0
  160. data/doc/cxxapi/inherit__graph__38.map +3 -1
  161. data/doc/cxxapi/inherit__graph__38.md5 +1 -1
  162. data/doc/cxxapi/inherit__graph__38.png +0 -0
  163. data/doc/cxxapi/inherit__graph__39.map +3 -1
  164. data/doc/cxxapi/inherit__graph__39.md5 +1 -1
  165. data/doc/cxxapi/inherit__graph__39.png +0 -0
  166. data/doc/cxxapi/inherits.html +33 -24
  167. data/doc/cxxapi/namespacePassenger.html +52 -0
  168. data/doc/cxxapi/namespacemembers.html +6 -0
  169. data/doc/cxxapi/namespacemembers_func.html +6 -0
  170. data/doc/cxxapi/tree.html +8 -0
  171. data/ext/apache2/Configuration.cpp +30 -8
  172. data/ext/apache2/Configuration.hpp +15 -14
  173. data/ext/apache2/DirectoryMapper.h +0 -16
  174. data/ext/apache2/Hooks.cpp +30 -29
  175. data/ext/boost/algorithm/string/detail/case_conv.hpp +6 -6
  176. data/ext/boost/algorithm/string/detail/find_format.hpp +14 -4
  177. data/ext/boost/algorithm/string/detail/find_format_all.hpp +13 -3
  178. data/ext/boost/algorithm/string/detail/find_format_store.hpp +11 -0
  179. data/ext/boost/algorithm/string/erase.hpp +2 -2
  180. data/ext/boost/bind/placeholders.hpp +2 -2
  181. data/ext/boost/concept/detail/backward_compatibility.hpp +16 -0
  182. data/ext/boost/concept/detail/general.hpp +15 -6
  183. data/ext/boost/concept/detail/has_constraints.hpp +5 -3
  184. data/ext/boost/concept/usage.hpp +5 -4
  185. data/ext/boost/concept_check.hpp +10 -1
  186. data/ext/boost/config/abi/borland_prefix.hpp +1 -1
  187. data/ext/boost/config/auto_link.hpp +68 -21
  188. data/ext/boost/config/compiler/borland.hpp +11 -3
  189. data/ext/boost/config/compiler/clang.hpp +62 -0
  190. data/ext/boost/config/compiler/codegear.hpp +21 -7
  191. data/ext/boost/config/compiler/common_edg.hpp +4 -2
  192. data/ext/boost/config/compiler/digitalmars.hpp +1 -1
  193. data/ext/boost/config/compiler/gcc.hpp +46 -7
  194. data/ext/boost/config/compiler/gcc_xml.hpp +25 -0
  195. data/ext/boost/config/compiler/intel.hpp +23 -0
  196. data/ext/boost/config/compiler/kai.hpp +1 -1
  197. data/ext/boost/config/compiler/metrowerks.hpp +1 -1
  198. data/ext/boost/config/compiler/nvcc.hpp +86 -0
  199. data/ext/boost/config/compiler/pgi.hpp +18 -3
  200. data/ext/boost/config/compiler/sunpro_cc.hpp +19 -5
  201. data/ext/boost/config/compiler/vacpp.hpp +8 -0
  202. data/ext/boost/config/compiler/visualc.hpp +27 -11
  203. data/ext/boost/config/platform/cygwin.hpp +0 -3
  204. data/ext/boost/config/platform/symbian.hpp +94 -0
  205. data/ext/boost/config/platform/win32.hpp +8 -1
  206. data/ext/boost/config/select_compiler_config.hpp +10 -0
  207. data/ext/boost/config/select_platform_config.hpp +4 -0
  208. data/ext/boost/config/stdlib/dinkumware.hpp +11 -1
  209. data/ext/boost/config/stdlib/libcomo.hpp +1 -0
  210. data/ext/boost/config/stdlib/libstdcpp3.hpp +1 -0
  211. data/ext/boost/config/stdlib/modena.hpp +1 -0
  212. data/ext/boost/config/stdlib/msl.hpp +1 -0
  213. data/ext/boost/config/stdlib/roguewave.hpp +1 -0
  214. data/ext/boost/config/stdlib/sgi.hpp +1 -0
  215. data/ext/boost/config/stdlib/stlport.hpp +1 -0
  216. data/ext/boost/config/stdlib/vacpp.hpp +1 -0
  217. data/ext/boost/config/suffix.hpp +40 -2
  218. data/ext/boost/cstdint.hpp +36 -7
  219. data/ext/boost/date_time/gregorian/conversion.hpp +4 -2
  220. data/ext/boost/date_time/microsec_time_clock.hpp +7 -7
  221. data/ext/boost/date_time/posix_time/conversion.hpp +4 -2
  222. data/ext/boost/date_time/time_facet.hpp +43 -4
  223. data/ext/boost/detail/endian.hpp +5 -2
  224. data/ext/boost/detail/lcast_precision.hpp +2 -2
  225. data/ext/boost/detail/sp_typeinfo.hpp +1 -1
  226. data/ext/boost/detail/workaround.hpp +5 -0
  227. data/ext/boost/exception/detail/error_info_impl.hpp +3 -3
  228. data/ext/boost/exception/detail/exception_ptr.hpp +76 -135
  229. data/ext/boost/exception/detail/is_output_streamable.hpp +15 -2
  230. data/ext/boost/exception/detail/type_info.hpp +9 -5
  231. data/ext/boost/exception/diagnostic_information.hpp +5 -3
  232. data/ext/boost/exception/exception.hpp +60 -46
  233. data/ext/boost/exception/info.hpp +47 -14
  234. data/ext/boost/function/function_base.hpp +4 -4
  235. data/ext/boost/integer.hpp +4 -0
  236. data/ext/boost/integer_fwd.hpp +9 -3
  237. data/ext/boost/iterator/iterator_concepts.hpp +284 -0
  238. data/ext/boost/iterator/transform_iterator.hpp +0 -1
  239. data/ext/boost/make_shared.hpp +17 -0
  240. data/ext/boost/mpl/aux_/config/has_xxx.hpp +4 -3
  241. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +2 -6
  242. data/ext/boost/mpl/aux_/template_arity.hpp +4 -4
  243. data/ext/boost/mpl/eval_if.hpp +3 -3
  244. data/ext/boost/mpl/has_xxx.hpp +369 -3
  245. data/ext/boost/optional/optional.hpp +3 -1
  246. data/ext/boost/optional/optional_fwd.hpp +1 -1
  247. data/ext/boost/preprocessor/repetition/enum_trailing_params.hpp +38 -0
  248. data/ext/boost/range/algorithm/equal.hpp +188 -0
  249. data/ext/boost/range/as_literal.hpp +15 -15
  250. data/ext/boost/range/concepts.hpp +331 -0
  251. data/ext/boost/range/const_iterator.hpp +7 -4
  252. data/ext/boost/range/detail/extract_optional_type.hpp +52 -0
  253. data/ext/boost/range/detail/implementation_help.hpp +7 -7
  254. data/ext/boost/range/detail/misc_concept.hpp +33 -0
  255. data/ext/boost/range/iterator.hpp +32 -32
  256. data/ext/boost/range/iterator_range.hpp +8 -651
  257. data/ext/boost/range/iterator_range_core.hpp +542 -0
  258. data/ext/boost/range/iterator_range_io.hpp +93 -0
  259. data/ext/boost/range/mutable_iterator.hpp +7 -4
  260. data/ext/boost/range/size.hpp +1 -1
  261. data/ext/boost/range/size_type.hpp +2 -1
  262. data/ext/boost/shared_array.hpp +19 -0
  263. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +2 -2
  264. data/ext/boost/smart_ptr/detail/yield_k.hpp +1 -1
  265. data/ext/boost/smart_ptr/make_shared.hpp +508 -0
  266. data/ext/boost/smart_ptr/shared_array.hpp +147 -0
  267. data/ext/boost/src/pthread/thread.cpp +16 -21
  268. data/ext/boost/src/pthread/timeconv.inl +7 -4
  269. data/ext/boost/thread/barrier.hpp +2 -1
  270. data/ext/boost/thread/detail/config.hpp +7 -1
  271. data/ext/boost/thread/detail/platform.hpp +1 -1
  272. data/ext/boost/thread/detail/thread.hpp +62 -18
  273. data/ext/boost/thread/detail/thread_group.hpp +5 -2
  274. data/ext/boost/thread/detail/tss_hooks.hpp +8 -25
  275. data/ext/boost/thread/future.hpp +45 -34
  276. data/ext/boost/thread/locks.hpp +184 -55
  277. data/ext/boost/thread/pthread/condition_variable.hpp +7 -7
  278. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +4 -2
  279. data/ext/boost/thread/pthread/mutex.hpp +29 -17
  280. data/ext/boost/thread/pthread/once.hpp +5 -0
  281. data/ext/boost/thread/pthread/recursive_mutex.hpp +97 -18
  282. data/ext/boost/thread/pthread/shared_mutex.hpp +1 -1
  283. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +1 -1
  284. data/ext/boost/thread/tss.hpp +2 -0
  285. data/ext/boost/throw_exception.hpp +21 -5
  286. data/ext/boost/token_functions.hpp +111 -91
  287. data/ext/boost/type_traits/add_reference.hpp +19 -1
  288. data/ext/boost/type_traits/function_traits.hpp +2 -2
  289. data/ext/boost/type_traits/is_const.hpp +24 -5
  290. data/ext/boost/type_traits/is_convertible.hpp +1 -1
  291. data/ext/boost/type_traits/is_function.hpp +3 -0
  292. data/ext/boost/type_traits/is_lvalue_reference.hpp +118 -0
  293. data/ext/boost/type_traits/is_reference.hpp +8 -81
  294. data/ext/boost/type_traits/is_rvalue_reference.hpp +29 -0
  295. data/ext/boost/type_traits/is_same.hpp +2 -2
  296. data/ext/boost/type_traits/is_volatile.hpp +26 -7
  297. data/ext/boost/type_traits/remove_const.hpp +12 -0
  298. data/ext/boost/type_traits/remove_cv.hpp +23 -1
  299. data/ext/boost/type_traits/remove_reference.hpp +21 -1
  300. data/ext/boost/type_traits/type_with_alignment.hpp +10 -10
  301. data/ext/boost/units/detail/utility.hpp +104 -0
  302. data/ext/boost/utility/compare_pointees.hpp +1 -1
  303. data/ext/common/AgentsStarter.hpp +151 -161
  304. data/ext/common/ApplicationPool/Pool.h +16 -4
  305. data/ext/common/Constants.h +1 -1
  306. data/ext/common/EventedClient.h +130 -26
  307. data/ext/common/Exceptions.h +15 -2
  308. data/ext/common/FileDescriptor.h +76 -12
  309. data/ext/common/IniFile.h +488 -0
  310. data/ext/common/LoggingAgent/LoggingServer.h +2 -2
  311. data/ext/common/LoggingAgent/RemoteSender.h +15 -6
  312. data/ext/common/MessageChannel.h +17 -101
  313. data/ext/common/PoolOptions.h +1 -0
  314. data/ext/common/ResourceLocator.h +78 -28
  315. data/ext/common/SafeLibev.h +149 -0
  316. data/ext/common/ServerInstanceDir.h +11 -7
  317. data/ext/common/Session.h +1 -1
  318. data/ext/common/SpawnManager.h +14 -14
  319. data/ext/common/StaticString.h +75 -0
  320. data/ext/common/Utils.cpp +304 -12
  321. data/ext/common/Utils.h +17 -0
  322. data/ext/common/Utils/BufferedIO.h +196 -0
  323. data/ext/common/Utils/IOUtils.cpp +159 -0
  324. data/ext/common/Utils/IOUtils.h +118 -1
  325. data/ext/common/Utils/ProcessMetricsCollector.h +184 -56
  326. data/ext/common/Utils/StrIntUtils.cpp +45 -11
  327. data/ext/common/Utils/StrIntUtils.h +8 -5
  328. data/ext/common/Utils/Timer.h +22 -0
  329. data/ext/common/Utils/utf8.h +35 -0
  330. data/ext/common/Utils/utf8/checked.h +324 -0
  331. data/ext/common/Utils/utf8/core.h +359 -0
  332. data/ext/common/Utils/utf8/unchecked.h +229 -0
  333. data/ext/common/Watchdog.cpp +52 -85
  334. data/ext/libev/config.h +122 -0
  335. data/ext/nginx/Configuration.c +7 -1
  336. data/ext/nginx/HelperAgent.cpp +16 -18
  337. data/ext/nginx/config +6 -4
  338. data/ext/oxt/system_calls.cpp +10 -0
  339. data/ext/oxt/system_calls.hpp +2 -0
  340. data/lib/phusion_passenger.rb +6 -11
  341. data/lib/phusion_passenger/dependencies.rb +2 -0
  342. data/lib/phusion_passenger/packaging.rb +5 -5
  343. data/lib/phusion_passenger/platform_info.rb +88 -0
  344. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +3 -17
  345. data/lib/phusion_passenger/platform_info/compiler.rb +14 -32
  346. data/lib/phusion_passenger/platform_info/curl.rb +6 -1
  347. data/lib/phusion_passenger/platform_info/operating_system.rb +107 -0
  348. data/lib/phusion_passenger/public_api.rb +2 -2
  349. data/lib/phusion_passenger/rails3_extensions/init.rb +5 -2
  350. data/lib/phusion_passenger/standalone/command.rb +6 -2
  351. data/lib/phusion_passenger/standalone/package_runtime_command.rb +2 -2
  352. data/lib/phusion_passenger/standalone/runtime_installer.rb +17 -5
  353. data/lib/phusion_passenger/standalone/start_command.rb +12 -12
  354. data/lib/phusion_passenger/standalone/stop_command.rb +3 -3
  355. data/lib/phusion_passenger/standalone/utils.rb +6 -2
  356. data/lib/phusion_passenger/templates/standalone/config.erb +37 -5
  357. data/lib/phusion_passenger/utils.rb +4 -7
  358. data/resources/mime.types +73 -0
  359. data/{misc → resources}/union_station_gateway.crt +0 -0
  360. data/test/cxx/BufferedIOTest.cpp +364 -0
  361. data/test/cxx/EventedClientTest.cpp +150 -13
  362. data/test/cxx/IOUtilsTest.cpp +399 -1
  363. data/test/cxx/MessageChannelTest.cpp +5 -120
  364. data/test/cxx/ProcessMetricsCollectorTest.cpp +121 -0
  365. data/test/cxx/StaticStringTest.cpp +134 -0
  366. data/test/cxx/UtilsTest.cpp +16 -46
  367. data/test/stub/rails_apps/2.3/mycook/public/dispatch.cgi +2 -2
  368. data/test/stub/rails_apps/2.3/mycook/public/dispatch.fcgi +1 -1
  369. data/test/stub/rails_apps/2.3/mycook/public/dispatch.rb +1 -1
  370. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +73 -0
  371. data/test/support/allocate_memory.c +14 -0
  372. data/test/support/test_helper.rb +3 -0
  373. metadata +57 -174
  374. data/bin/passenger-stress-test +0 -345
  375. data/debian/postinst +0 -24
  376. data/doc/rdoc/classes/ConditionVariable.html +0 -215
  377. data/doc/rdoc/classes/Exception.html +0 -120
  378. data/doc/rdoc/classes/GC.html +0 -113
  379. data/doc/rdoc/classes/IO.html +0 -221
  380. data/doc/rdoc/classes/PhusionPassenger.html +0 -397
  381. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +0 -180
  382. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +0 -647
  383. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +0 -654
  384. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +0 -92
  385. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +0 -97
  386. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +0 -96
  387. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +0 -97
  388. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +0 -96
  389. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +0 -619
  390. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +0 -142
  391. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +0 -368
  392. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +0 -231
  393. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +0 -588
  394. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +0 -92
  395. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +0 -92
  396. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +0 -147
  397. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +0 -279
  398. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +0 -92
  399. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +0 -92
  400. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +0 -123
  401. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +0 -92
  402. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +0 -341
  403. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +0 -294
  404. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +0 -199
  405. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +0 -155
  406. data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +0 -367
  407. data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +0 -95
  408. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +0 -351
  409. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +0 -98
  410. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +0 -200
  411. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +0 -410
  412. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +0 -98
  413. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +0 -156
  414. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +0 -115
  415. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +0 -202
  416. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +0 -172
  417. data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +0 -273
  418. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +0 -145
  419. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +0 -162
  420. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +0 -141
  421. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +0 -92
  422. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +0 -673
  423. data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +0 -92
  424. data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +0 -415
  425. data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +0 -134
  426. data/doc/rdoc/classes/PhusionPassenger/Packaging.html +0 -129
  427. data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +0 -1809
  428. data/doc/rdoc/classes/PhusionPassenger/Plugin.html +0 -237
  429. data/doc/rdoc/classes/PhusionPassenger/Rack.html +0 -91
  430. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +0 -312
  431. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +0 -98
  432. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +0 -218
  433. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +0 -114
  434. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +0 -256
  435. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +0 -139
  436. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +0 -118
  437. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +0 -135
  438. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +0 -378
  439. data/doc/rdoc/classes/PhusionPassenger/Standalone.html +0 -111
  440. data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +0 -252
  441. data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +0 -161
  442. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +0 -368
  443. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +0 -132
  444. data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +0 -151
  445. data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +0 -189
  446. data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +0 -177
  447. data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +0 -341
  448. data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +0 -203
  449. data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +0 -156
  450. data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +0 -168
  451. data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +0 -86
  452. data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +0 -135
  453. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +0 -125
  454. data/doc/rdoc/classes/PhusionPassenger/Utils.html +0 -1550
  455. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +0 -204
  456. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +0 -171
  457. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +0 -140
  458. data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +0 -260
  459. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +0 -169
  460. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +0 -265
  461. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +0 -120
  462. data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +0 -561
  463. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +0 -140
  464. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +0 -89
  465. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +0 -182
  466. data/doc/rdoc/classes/Process.html +0 -115
  467. data/doc/rdoc/classes/Signal.html +0 -139
  468. data/doc/rdoc/created.rid +0 -1
  469. data/doc/rdoc/files/DEVELOPERS_TXT.html +0 -276
  470. data/doc/rdoc/files/README.html +0 -157
  471. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +0 -130
  472. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +0 -135
  473. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +0 -126
  474. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +0 -128
  475. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +0 -126
  476. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +0 -132
  477. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +0 -122
  478. data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +0 -129
  479. data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +0 -127
  480. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +0 -141
  481. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +0 -126
  482. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +0 -146
  483. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +0 -125
  484. data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +0 -132
  485. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +0 -126
  486. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +0 -122
  487. data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +0 -122
  488. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +0 -147
  489. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +0 -122
  490. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +0 -127
  491. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +0 -120
  492. data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +0 -127
  493. data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +0 -132
  494. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +0 -122
  495. data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +0 -127
  496. data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +0 -129
  497. data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +0 -126
  498. data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +0 -126
  499. data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +0 -126
  500. data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +0 -126
  501. data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +0 -127
  502. data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +0 -128
  503. data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +0 -126
  504. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +0 -122
  505. data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +0 -127
  506. data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +0 -127
  507. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +0 -137
  508. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +0 -125
  509. data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +0 -127
  510. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +0 -122
  511. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +0 -160
  512. data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +0 -127
  513. data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +0 -135
  514. data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +0 -126
  515. data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +0 -126
  516. data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +0 -126
  517. data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +0 -127
  518. data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +0 -133
  519. data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +0 -136
  520. data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +0 -126
  521. data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +0 -126
  522. data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +0 -126
  523. data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +0 -127
  524. data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +0 -126
  525. data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +0 -120
  526. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +0 -100
  527. data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +0 -122
  528. data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +0 -126
  529. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +0 -179
  530. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +0 -132
  531. data/doc/rdoc/fr_class_index.html +0 -138
  532. data/doc/rdoc/fr_file_index.html +0 -108
  533. data/doc/rdoc/fr_method_index.html +0 -430
  534. data/doc/rdoc/index.html +0 -26
  535. data/doc/rdoc/rdoc-style.css +0 -187
  536. data/ext/apache2/LICENSE-CNRI.TXT +0 -79
  537. data/ext/common/Utils/BlockingScalar.h +0 -50
  538. data/ext/common/Utils/FileHandleGuard.h +0 -81
@@ -4,7 +4,7 @@
4
4
  // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5
5
  // http://www.boost.org/LICENSE_1_0.txt)
6
6
  //
7
- // See http://www.boost.org/lib/optional for documentation.
7
+ // See http://www.boost.org/libs/optional for documentation.
8
8
  //
9
9
  // You are welcome to contact the author at:
10
10
  // fernando_cacciola@hotmail.com
@@ -168,8 +168,10 @@ class optional_base : public optional_tag
168
168
 
169
169
  typedef BOOST_DEDUCED_TYPENAME is_reference<T>::type is_reference_predicate ;
170
170
 
171
+ public:
171
172
  typedef BOOST_DEDUCED_TYPENAME mpl::if_<is_reference_predicate,types_when_ref,types_when_not_ref>::type types ;
172
173
 
174
+ protected:
173
175
  typedef bool (this_type::*unspecified_bool_type)() const;
174
176
 
175
177
  typedef BOOST_DEDUCED_TYPENAME types::reference_type reference_type ;
@@ -4,7 +4,7 @@
4
4
  // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5
5
  // http://www.boost.org/LICENSE_1_0.txt)
6
6
  //
7
- // See http://www.boost.org/lib/optional for documentation.
7
+ // See http://www.boost.org/libs/optional for documentation.
8
8
  //
9
9
  // You are welcome to contact the author at:
10
10
  // fernando_cacciola@hotmail.com
@@ -0,0 +1,38 @@
1
+ # /* **************************************************************************
2
+ # * *
3
+ # * (C) Copyright Paul Mensonides 2002.
4
+ # * Distributed under the Boost Software License, Version 1.0. (See
5
+ # * accompanying file LICENSE_1_0.txt or copy at
6
+ # * http://www.boost.org/LICENSE_1_0.txt)
7
+ # * *
8
+ # ************************************************************************** */
9
+ #
10
+ # /* See http://www.boost.org for most recent version. */
11
+ #
12
+ # ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP
13
+ # define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP
14
+ #
15
+ # include <boost/preprocessor/config/config.hpp>
16
+ # include <boost/preprocessor/repetition/repeat.hpp>
17
+ #
18
+ # /* BOOST_PP_ENUM_TRAILING_PARAMS */
19
+ #
20
+ # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
21
+ # define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
22
+ # else
23
+ # define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param)
24
+ # define BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
25
+ # endif
26
+ #
27
+ # define BOOST_PP_ENUM_TRAILING_PARAMS_M(z, n, param) , param ## n
28
+ #
29
+ # /* BOOST_PP_ENUM_TRAILING_PARAMS_Z */
30
+ #
31
+ # if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()
32
+ # define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
33
+ # else
34
+ # define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param)
35
+ # define BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)
36
+ # endif
37
+ #
38
+ # endif
@@ -0,0 +1,188 @@
1
+ // Boost.Range library
2
+ //
3
+ // Copyright Neil Groves 2009.
4
+ // Use, modification and distribution is subject to the Boost Software
5
+ // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6
+ // http://www.boost.org/LICENSE_1_0.txt)
7
+ //
8
+ // For more information, see http://www.boost.org/libs/range/
9
+ //
10
+ #ifndef BOOST_RANGE_ALGORITHM_EQUAL_HPP_INCLUDED
11
+ #define BOOST_RANGE_ALGORITHM_EQUAL_HPP_INCLUDED
12
+
13
+ #include <boost/config.hpp>
14
+ #include <boost/range/concepts.hpp>
15
+ #include <iterator>
16
+
17
+ namespace boost
18
+ {
19
+ namespace range_detail
20
+ {
21
+ // An implementation of equality comparison that is optimized for iterator
22
+ // traversal categories less than RandomAccessTraversal.
23
+ template< class SinglePassTraversalReadableIterator1,
24
+ class SinglePassTraversalReadableIterator2,
25
+ class IteratorCategoryTag1,
26
+ class IteratorCategoryTag2 >
27
+ inline bool equal_impl( SinglePassTraversalReadableIterator1 first1,
28
+ SinglePassTraversalReadableIterator1 last1,
29
+ SinglePassTraversalReadableIterator2 first2,
30
+ SinglePassTraversalReadableIterator2 last2,
31
+ IteratorCategoryTag1,
32
+ IteratorCategoryTag2 )
33
+ {
34
+ do
35
+ {
36
+ // If we have reached the end of the left range then this is
37
+ // the end of the loop. They are equal if and only if we have
38
+ // simultaneously reached the end of the right range.
39
+ if (first1 == last1)
40
+ return first2 == last2;
41
+
42
+ // If we have reached the end of the right range at this line
43
+ // it indicates that the right range is shorter than the left
44
+ // and hence the result is false.
45
+ if (first2 == last2)
46
+ return false;
47
+
48
+ // continue looping if and only if the values are equal
49
+ } while(*first1++ == *first2++);
50
+
51
+ // Reaching this line in the algorithm indicates that a value
52
+ // inequality has been detected.
53
+ return false;
54
+ }
55
+
56
+ template< class SinglePassTraversalReadableIterator1,
57
+ class SinglePassTraversalReadableIterator2,
58
+ class IteratorCategoryTag1,
59
+ class IteratorCategoryTag2,
60
+ class BinaryPredicate >
61
+ inline bool equal_impl( SinglePassTraversalReadableIterator1 first1,
62
+ SinglePassTraversalReadableIterator1 last1,
63
+ SinglePassTraversalReadableIterator2 first2,
64
+ SinglePassTraversalReadableIterator2 last2,
65
+ BinaryPredicate pred,
66
+ IteratorCategoryTag1,
67
+ IteratorCategoryTag2 )
68
+ {
69
+ do
70
+ {
71
+ // If we have reached the end of the left range then this is
72
+ // the end of the loop. They are equal if and only if we have
73
+ // simultaneously reached the end of the right range.
74
+ if (first1 == last1)
75
+ return first2 == last2;
76
+
77
+ // If we have reached the end of the right range at this line
78
+ // it indicates that the right range is shorter than the left
79
+ // and hence the result is false.
80
+ if (first2 == last2)
81
+ return false;
82
+
83
+ // continue looping if and only if the values are equal
84
+ } while(pred(*first1++, *first2++));
85
+
86
+ // Reaching this line in the algorithm indicates that a value
87
+ // inequality has been detected.
88
+ return false;
89
+ }
90
+
91
+ // An implementation of equality comparison that is optimized for
92
+ // random access iterators.
93
+ template< class RandomAccessTraversalReadableIterator1,
94
+ class RandomAccessTraversalReadableIterator2 >
95
+ inline bool equal_impl( RandomAccessTraversalReadableIterator1 first1,
96
+ RandomAccessTraversalReadableIterator1 last1,
97
+ RandomAccessTraversalReadableIterator2 first2,
98
+ RandomAccessTraversalReadableIterator2 last2,
99
+ std::random_access_iterator_tag,
100
+ std::random_access_iterator_tag )
101
+ {
102
+ return ((last1 - first1) == (last2 - first2))
103
+ && std::equal(first1, last1, first2);
104
+ }
105
+
106
+ template< class RandomAccessTraversalReadableIterator1,
107
+ class RandomAccessTraversalReadableIterator2,
108
+ class BinaryPredicate >
109
+ inline bool equal_impl( RandomAccessTraversalReadableIterator1 first1,
110
+ RandomAccessTraversalReadableIterator1 last1,
111
+ RandomAccessTraversalReadableIterator2 first2,
112
+ RandomAccessTraversalReadableIterator2 last2,
113
+ BinaryPredicate pred )
114
+ {
115
+ return ((last1 - first1) == (last2 - first2))
116
+ && std::equal(first1, last1, first2, pred);
117
+ }
118
+
119
+ template< class SinglePassTraversalReadableIterator1,
120
+ class SinglePassTraversalReadableIterator2 >
121
+ inline bool equal( SinglePassTraversalReadableIterator1 first1,
122
+ SinglePassTraversalReadableIterator1 last1,
123
+ SinglePassTraversalReadableIterator2 first2,
124
+ SinglePassTraversalReadableIterator2 last2 )
125
+ {
126
+ BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator1 >::iterator_category tag1;
127
+ BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator2 >::iterator_category tag2;
128
+
129
+ return equal_impl(first1, last1, first2, last2, tag1, tag2);
130
+ }
131
+
132
+ template< class SinglePassTraversalReadableIterator1,
133
+ class SinglePassTraversalReadableIterator2,
134
+ class BinaryPredicate >
135
+ inline bool equal( SinglePassTraversalReadableIterator1 first1,
136
+ SinglePassTraversalReadableIterator1 last1,
137
+ SinglePassTraversalReadableIterator2 first2,
138
+ SinglePassTraversalReadableIterator2 last2,
139
+ BinaryPredicate pred )
140
+ {
141
+ BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator1 >::iterator_category tag1;
142
+ BOOST_DEDUCED_TYPENAME std::iterator_traits< SinglePassTraversalReadableIterator2 >::iterator_category tag2;
143
+
144
+ return equal_impl(first1, last1, first2, last2, pred, tag1, tag2);
145
+ }
146
+
147
+ } // namespace range_detail
148
+
149
+ namespace range
150
+ {
151
+
152
+ /// \brief template function equal
153
+ ///
154
+ /// range-based version of the equal std algorithm
155
+ ///
156
+ /// \pre SinglePassRange1 is a model of the SinglePassRangeConcept
157
+ /// \pre SinglePassRange2 is a model of the SinglePassRangeConcept
158
+ /// \pre BinaryPredicate is a model of the BinaryPredicateConcept
159
+ template< class SinglePassRange1, class SinglePassRange2 >
160
+ inline bool equal( const SinglePassRange1& rng1, const SinglePassRange2& rng2 )
161
+ {
162
+ BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange1> ));
163
+ BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange2> ));
164
+
165
+ return ::boost::range_detail::equal(
166
+ ::boost::begin(rng1), ::boost::end(rng1),
167
+ ::boost::begin(rng2), ::boost::end(rng2) );
168
+ }
169
+
170
+ /// \overload
171
+ template< class SinglePassRange1, class SinglePassRange2, class BinaryPredicate >
172
+ inline bool equal( const SinglePassRange1& rng1, const SinglePassRange2& rng2,
173
+ BinaryPredicate pred )
174
+ {
175
+ BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange1> ));
176
+ BOOST_RANGE_CONCEPT_ASSERT(( SinglePassRangeConcept<const SinglePassRange2> ));
177
+
178
+ return ::boost::range_detail::equal(
179
+ ::boost::begin(rng1), ::boost::end(rng1),
180
+ ::boost::begin(rng2), ::boost::end(rng2),
181
+ pred);
182
+ }
183
+
184
+ } // namespace range
185
+ using range::equal;
186
+ } // namespace boost
187
+
188
+ #endif // include guard
@@ -25,7 +25,7 @@
25
25
  #include <boost/detail/workaround.hpp>
26
26
 
27
27
  #include <cstring>
28
- #ifndef BOOST_NO_CWCHAR
28
+ #ifndef BOOST_NO_CWCHAR
29
29
  #include <cwchar>
30
30
  #endif
31
31
 
@@ -38,41 +38,41 @@ namespace boost
38
38
  return strlen( s );
39
39
  }
40
40
 
41
- #ifndef BOOST_NO_CWCHAR
41
+ #ifndef BOOST_NO_CWCHAR
42
42
  inline std::size_t length( const wchar_t* s )
43
43
  {
44
44
  return wcslen( s );
45
45
  }
46
- #endif
46
+ #endif
47
47
 
48
48
  //
49
49
  // Remark: the compiler cannot choose between T* and T[sz]
50
50
  // overloads, so we must put the T* internal to the
51
51
  // unconstrained version.
52
- //
52
+ //
53
53
 
54
54
  inline bool is_char_ptr( char* )
55
55
  {
56
56
  return true;
57
57
  }
58
-
58
+
59
59
  inline bool is_char_ptr( const char* )
60
60
  {
61
61
  return true;
62
62
  }
63
63
 
64
- #ifndef BOOST_NO_CWCHAR
64
+ #ifndef BOOST_NO_CWCHAR
65
65
  inline bool is_char_ptr( wchar_t* )
66
66
  {
67
67
  return true;
68
68
  }
69
-
69
+
70
70
  inline bool is_char_ptr( const wchar_t* )
71
71
  {
72
72
  return true;
73
73
  }
74
74
  #endif
75
-
75
+
76
76
  template< class T >
77
77
  inline long is_char_ptr( T /* r */ )
78
78
  {
@@ -80,30 +80,30 @@ namespace boost
80
80
  }
81
81
 
82
82
  template< class T >
83
- inline iterator_range<T*>
83
+ inline iterator_range<T*>
84
84
  make_range( T* const r, bool )
85
85
  {
86
86
  return iterator_range<T*>( r, r + length(r) );
87
87
  }
88
88
 
89
89
  template< class T >
90
- inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<T>::type>
90
+ inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<T>::type>
91
91
  make_range( T& r, long )
92
92
  {
93
93
  return boost::make_iterator_range( r );
94
94
  }
95
95
 
96
96
  }
97
-
97
+
98
98
  template< class Range >
99
- inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<Range>::type>
99
+ inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<Range>::type>
100
100
  as_literal( Range& r )
101
101
  {
102
102
  return range_detail::make_range( r, range_detail::is_char_ptr(r) );
103
103
  }
104
104
 
105
105
  template< class Range >
106
- inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<const Range>::type>
106
+ inline iterator_range<BOOST_DEDUCED_TYPENAME range_iterator<const Range>::type>
107
107
  as_literal( const Range& r )
108
108
  {
109
109
  return range_detail::make_range( r, range_detail::is_char_ptr(r) );
@@ -112,9 +112,9 @@ namespace boost
112
112
  template< class Char, std::size_t sz >
113
113
  inline iterator_range<Char*> as_literal( Char (&arr)[sz] )
114
114
  {
115
- return range_detail::make_range( arr, range_detail::is_char_ptr(arr) );
115
+ return range_detail::make_range( arr, range_detail::is_char_ptr(arr) );
116
116
  }
117
-
117
+
118
118
  template< class Char, std::size_t sz >
119
119
  inline iterator_range<const Char*> as_literal( const Char (&arr)[sz] )
120
120
  {
@@ -0,0 +1,331 @@
1
+ // Boost.Range library concept checks
2
+ //
3
+ // Copyright Neil Groves 2009. Use, modification and distribution
4
+ // are subject to the Boost Software License, Version 1.0. (See
5
+ // accompanying file LICENSE_1_0.txt or copy at
6
+ // http://www.boost.org/LICENSE_1_0.txt)
7
+ //
8
+ // Copyright Daniel Walker 2006. Use, modification and distribution
9
+ // are subject to the Boost Software License, Version 1.0. (See
10
+ // accompanying file LICENSE_1_0.txt or copy at
11
+ // http://www.boost.org/LICENSE_1_0.txt)
12
+ //
13
+ // For more information, see http://www.boost.org/libs/range/
14
+ //
15
+
16
+ #ifndef BOOST_RANGE_CONCEPTS_HPP
17
+ #define BOOST_RANGE_CONCEPTS_HPP
18
+
19
+ #include <boost/concept_check.hpp>
20
+ #include <boost/iterator/iterator_concepts.hpp>
21
+ #include <boost/range/begin.hpp>
22
+ #include <boost/range/end.hpp>
23
+ #include <boost/range/iterator.hpp>
24
+ #include <boost/range/value_type.hpp>
25
+ #include <boost/range/detail/misc_concept.hpp>
26
+
27
+ /*!
28
+ * \file
29
+ * \brief Concept checks for the Boost Range library.
30
+ *
31
+ * The structures in this file may be used in conjunction with the
32
+ * Boost Concept Check library to insure that the type of a function
33
+ * parameter is compatible with a range concept. If not, a meaningful
34
+ * compile time error is generated. Checks are provided for the range
35
+ * concepts related to iterator traversal categories. For example, the
36
+ * following line checks that the type T models the ForwardRange
37
+ * concept.
38
+ *
39
+ * \code
40
+ * BOOST_CONCEPT_ASSERT((ForwardRangeConcept<T>));
41
+ * \endcode
42
+ *
43
+ * A different concept check is required to ensure writeable value
44
+ * access. For example to check for a ForwardRange that can be written
45
+ * to, the following code is required.
46
+ *
47
+ * \code
48
+ * BOOST_CONCEPT_ASSERT((WriteableForwardRangeConcept<T>));
49
+ * \endcode
50
+ *
51
+ * \see http://www.boost.org/libs/range/doc/range.html for details
52
+ * about range concepts.
53
+ * \see http://www.boost.org/libs/iterator/doc/iterator_concepts.html
54
+ * for details about iterator concepts.
55
+ * \see http://www.boost.org/libs/concept_check/concept_check.htm for
56
+ * details about concept checks.
57
+ */
58
+
59
+ namespace boost {
60
+
61
+ namespace range_detail {
62
+
63
+ #ifndef BOOST_RANGE_ENABLE_CONCEPT_ASSERT
64
+
65
+ // List broken compiler versions here:
66
+ #ifdef __GNUC__
67
+ // GNUC 4.2 has strange issues correctly detecting compliance with the Concepts
68
+ // hence the least disruptive approach is to turn-off the concept checking for
69
+ // this version of the compiler.
70
+ #if __GNUC__ == 4 && __GNUC_MINOR__ == 2
71
+ #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
72
+ #endif
73
+ #endif
74
+
75
+ #ifdef __BORLANDC__
76
+ #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
77
+ #endif
78
+
79
+ #ifdef __PATHCC__
80
+ #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 0
81
+ #endif
82
+
83
+ // Default to using the concept asserts unless we have defined it off
84
+ // during the search for black listed compilers.
85
+ #ifndef BOOST_RANGE_ENABLE_CONCEPT_ASSERT
86
+ #define BOOST_RANGE_ENABLE_CONCEPT_ASSERT 1
87
+ #endif
88
+
89
+ #endif
90
+
91
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
92
+ #define BOOST_RANGE_CONCEPT_ASSERT( x ) BOOST_CONCEPT_ASSERT( x )
93
+ #else
94
+ #define BOOST_RANGE_CONCEPT_ASSERT( x )
95
+ #endif
96
+
97
+ // Rationale for the inclusion of redefined iterator concept
98
+ // classes:
99
+ //
100
+ // The Range algorithms often do not require that the iterators are
101
+ // Assignable, but the correct standard conformant iterators
102
+ // do require the iterators to be a model of the Assignable concept.
103
+ // Iterators that contains a functor that is not assignable therefore
104
+ // are not correct models of the standard iterator concepts,
105
+ // despite being adequate for most algorithms. An example of this
106
+ // use case is the combination of the boost::adaptors::filtered
107
+ // class with a boost::lambda::bind generated functor.
108
+ // Ultimately modeling the range concepts using composition
109
+ // with the Boost.Iterator concepts would render the library
110
+ // incompatible with many common Boost.Lambda expressions.
111
+ template<class Iterator>
112
+ struct IncrementableIteratorConcept : CopyConstructible<Iterator>
113
+ {
114
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
115
+ typedef BOOST_DEDUCED_TYPENAME iterator_traversal<Iterator>::type traversal_category;
116
+
117
+ BOOST_RANGE_CONCEPT_ASSERT((
118
+ Convertible<
119
+ traversal_category,
120
+ incrementable_traversal_tag
121
+ >));
122
+
123
+ BOOST_CONCEPT_USAGE(IncrementableIteratorConcept)
124
+ {
125
+ ++i;
126
+ (void)i++;
127
+ }
128
+ private:
129
+ Iterator i;
130
+ #endif
131
+ };
132
+
133
+ template<class Iterator>
134
+ struct SinglePassIteratorConcept
135
+ : IncrementableIteratorConcept<Iterator>
136
+ , EqualityComparable<Iterator>
137
+ {
138
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
139
+ BOOST_RANGE_CONCEPT_ASSERT((
140
+ Convertible<
141
+ BOOST_DEDUCED_TYPENAME SinglePassIteratorConcept::traversal_category,
142
+ single_pass_traversal_tag
143
+ >));
144
+ #endif
145
+ };
146
+
147
+ template<class Iterator>
148
+ struct ForwardIteratorConcept
149
+ : SinglePassIteratorConcept<Iterator>
150
+ , DefaultConstructible<Iterator>
151
+ {
152
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
153
+ typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>::difference_type difference_type;
154
+
155
+ BOOST_MPL_ASSERT((is_integral<difference_type>));
156
+ BOOST_MPL_ASSERT_RELATION(std::numeric_limits<difference_type>::is_signed, ==, true);
157
+
158
+ BOOST_RANGE_CONCEPT_ASSERT((
159
+ Convertible<
160
+ BOOST_DEDUCED_TYPENAME ForwardIteratorConcept::traversal_category,
161
+ forward_traversal_tag
162
+ >));
163
+ #endif
164
+ };
165
+
166
+ template<class Iterator>
167
+ struct BidirectionalIteratorConcept
168
+ : ForwardIteratorConcept<Iterator>
169
+ {
170
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
171
+ BOOST_RANGE_CONCEPT_ASSERT((
172
+ Convertible<
173
+ BOOST_DEDUCED_TYPENAME BidirectionalIteratorConcept::traversal_category,
174
+ bidirectional_traversal_tag
175
+ >));
176
+
177
+ BOOST_CONCEPT_USAGE(BidirectionalIteratorConcept)
178
+ {
179
+ --i;
180
+ (void)i--;
181
+ }
182
+ private:
183
+ Iterator i;
184
+ #endif
185
+ };
186
+
187
+ template<class Iterator>
188
+ struct RandomAccessIteratorConcept
189
+ : BidirectionalIteratorConcept<Iterator>
190
+ {
191
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
192
+ BOOST_RANGE_CONCEPT_ASSERT((
193
+ Convertible<
194
+ BOOST_DEDUCED_TYPENAME RandomAccessIteratorConcept::traversal_category,
195
+ random_access_traversal_tag
196
+ >));
197
+
198
+ BOOST_CONCEPT_USAGE(RandomAccessIteratorConcept)
199
+ {
200
+ i += n;
201
+ i = i + n;
202
+ i = n + i;
203
+ i -= n;
204
+ i = i - n;
205
+ n = i - j;
206
+ }
207
+ private:
208
+ BOOST_DEDUCED_TYPENAME RandomAccessIteratorConcept::difference_type n;
209
+ Iterator i;
210
+ Iterator j;
211
+ #endif
212
+ };
213
+
214
+ } // namespace range_detail
215
+
216
+ //! Check if a type T models the SinglePassRange range concept.
217
+ template<class T>
218
+ struct SinglePassRangeConcept
219
+ {
220
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
221
+ typedef BOOST_DEDUCED_TYPENAME range_iterator<T const>::type const_iterator;
222
+ typedef BOOST_DEDUCED_TYPENAME range_iterator<T>::type iterator;
223
+
224
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::SinglePassIteratorConcept<iterator>));
225
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::SinglePassIteratorConcept<const_iterator>));
226
+
227
+ BOOST_CONCEPT_USAGE(SinglePassRangeConcept)
228
+ {
229
+ // This has been modified from assigning to this->i
230
+ // (where i was a member variable) to improve
231
+ // compatibility with Boost.Lambda
232
+ iterator i1 = boost::begin(*m_range);
233
+ iterator i2 = boost::end(*m_range);
234
+
235
+ ignore_unused_variable_warning(i1);
236
+ ignore_unused_variable_warning(i2);
237
+
238
+ const_constraints(*m_range);
239
+ }
240
+
241
+ private:
242
+ void const_constraints(const T& const_range)
243
+ {
244
+ const_iterator ci1 = boost::begin(const_range);
245
+ const_iterator ci2 = boost::end(const_range);
246
+
247
+ ignore_unused_variable_warning(ci1);
248
+ ignore_unused_variable_warning(ci2);
249
+ }
250
+
251
+ // Rationale:
252
+ // The type of m_range is T* rather than T because it allows
253
+ // T to be an abstract class. The other obvious alternative of
254
+ // T& produces a warning on some compilers.
255
+ T* m_range;
256
+ #endif
257
+ };
258
+
259
+ //! Check if a type T models the ForwardRange range concept.
260
+ template<class T>
261
+ struct ForwardRangeConcept : SinglePassRangeConcept<T>
262
+ {
263
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
264
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::ForwardIteratorConcept<BOOST_DEDUCED_TYPENAME ForwardRangeConcept::iterator>));
265
+ BOOST_RANGE_CONCEPT_ASSERT((range_detail::ForwardIteratorConcept<BOOST_DEDUCED_TYPENAME ForwardRangeConcept::const_iterator>));
266
+ #endif
267
+ };
268
+
269
+ template<class Range>
270
+ struct WriteableRangeConcept
271
+ {
272
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
273
+ typedef BOOST_DEDUCED_TYPENAME range_iterator<Range>::type iterator;
274
+
275
+ BOOST_CONCEPT_USAGE(WriteableRangeConcept)
276
+ {
277
+ *i = v;
278
+ }
279
+ private:
280
+ iterator i;
281
+ BOOST_DEDUCED_TYPENAME range_value<Range>::type v;
282
+ #endif
283
+ };
284
+
285
+ //! Check if a type T models the WriteableForwardRange range concept.
286
+ template<class T>
287
+ struct WriteableForwardRangeConcept
288
+ : ForwardRangeConcept<T>
289
+ , WriteableRangeConcept<T>
290
+ {
291
+ };
292
+
293
+ //! Check if a type T models the BidirectionalRange range concept.
294
+ template<class T>
295
+ struct BidirectionalRangeConcept : ForwardRangeConcept<T>
296
+ {
297
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
298
+ BOOST_RANGE_CONCEPT_ASSERT((BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::iterator>));
299
+ BOOST_RANGE_CONCEPT_ASSERT((BidirectionalIteratorConcept<BOOST_DEDUCED_TYPENAME BidirectionalRangeConcept::const_iterator>));
300
+ #endif
301
+ };
302
+
303
+ //! Check if a type T models the WriteableBidirectionalRange range concept.
304
+ template<class T>
305
+ struct WriteableBidirectionalRangeConcept
306
+ : BidirectionalRangeConcept<T>
307
+ , WriteableRangeConcept<T>
308
+ {
309
+ };
310
+
311
+ //! Check if a type T models the RandomAccessRange range concept.
312
+ template<class T>
313
+ struct RandomAccessRangeConcept : BidirectionalRangeConcept<T>
314
+ {
315
+ #if BOOST_RANGE_ENABLE_CONCEPT_ASSERT
316
+ BOOST_RANGE_CONCEPT_ASSERT((RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::iterator>));
317
+ BOOST_RANGE_CONCEPT_ASSERT((RandomAccessIteratorConcept<BOOST_DEDUCED_TYPENAME RandomAccessRangeConcept::const_iterator>));
318
+ #endif
319
+ };
320
+
321
+ //! Check if a type T models the WriteableRandomAccessRange range concept.
322
+ template<class T>
323
+ struct WriteableRandomAccessRangeConcept
324
+ : RandomAccessRangeConcept<T>
325
+ , WriteableRangeConcept<T>
326
+ {
327
+ };
328
+
329
+ } // namespace boost
330
+
331
+ #endif // BOOST_RANGE_CONCEPTS_HPP