passenger_dudemeister 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1565) hide show
  1. data/DEVELOPERS.TXT +113 -0
  2. data/INSTALL +6 -0
  3. data/LICENSE +19 -0
  4. data/NEWS +429 -0
  5. data/PACKAGING.TXT +25 -0
  6. data/README +45 -0
  7. data/Rakefile +56 -0
  8. data/bin/passenger +32 -0
  9. data/bin/passenger-config +46 -0
  10. data/bin/passenger-install-apache2-module +237 -0
  11. data/bin/passenger-install-nginx-module +476 -0
  12. data/bin/passenger-make-enterprisey +82 -0
  13. data/bin/passenger-memory-stats +171 -0
  14. data/bin/passenger-status +211 -0
  15. data/build/agents.rb +80 -0
  16. data/build/apache2.rb +168 -0
  17. data/build/basics.rb +105 -0
  18. data/build/common_library.rb +268 -0
  19. data/build/config.rb +42 -0
  20. data/build/cplusplus_support.rb +61 -0
  21. data/build/cxx_tests.rb +219 -0
  22. data/build/documentation.rb +84 -0
  23. data/build/gempackagetask.rb +99 -0
  24. data/build/integration_tests.rb +64 -0
  25. data/build/misc.rb +153 -0
  26. data/build/nginx.rb +72 -0
  27. data/build/oxt_tests.rb +59 -0
  28. data/build/packagetask.rb +186 -0
  29. data/build/packaging.rb +194 -0
  30. data/build/rake_extensions.rb +182 -0
  31. data/build/rdoctask.rb +209 -0
  32. data/build/rpm.rb +98 -0
  33. data/build/ruby_extension.rb +52 -0
  34. data/build/ruby_tests.rb +49 -0
  35. data/build/test_basics.rb +43 -0
  36. data/debian/README.Debian +15 -0
  37. data/debian/changelog +185 -0
  38. data/debian/compat +1 -0
  39. data/debian/control +49 -0
  40. data/debian/copyright +20 -0
  41. data/debian/libapache2-mod-passenger.install +1 -0
  42. data/debian/libapache2-mod-passenger.postinst +36 -0
  43. data/debian/libapache2-mod-passenger.prerm +15 -0
  44. data/debian/passenger-common.install +4 -0
  45. data/debian/passenger.conf +4 -0
  46. data/debian/passenger.load +1 -0
  47. data/debian/prerm +2 -0
  48. data/debian/rules +37 -0
  49. data/debian/watch +3 -0
  50. data/dev/copy_boost_headers.rb +155 -0
  51. data/dev/find_owner_pipe_leaks.rb +128 -0
  52. data/dev/render_error_pages.rb +116 -0
  53. data/doc/ApplicationPool algorithm.txt +615 -0
  54. data/doc/Architectural overview.html +1 -0
  55. data/doc/Architectural overview.txt +334 -0
  56. data/doc/Doxyfile +241 -0
  57. data/doc/Security of user switching support.html +1 -0
  58. data/doc/Security of user switching support.txt +197 -0
  59. data/doc/Users guide Apache.html +1 -0
  60. data/doc/Users guide Apache.txt +2208 -0
  61. data/doc/Users guide Nginx.html +1 -0
  62. data/doc/Users guide Nginx.txt +1394 -0
  63. data/doc/Users guide Standalone.html +1 -0
  64. data/doc/Users guide Standalone.txt +40 -0
  65. data/doc/definitions.h +5 -0
  66. data/doc/images/by_sa.png +0 -0
  67. data/doc/images/conservative_spawning.png +0 -0
  68. data/doc/images/conservative_spawning.svg +248 -0
  69. data/doc/images/icons/README +5 -0
  70. data/doc/images/icons/callouts/1.png +0 -0
  71. data/doc/images/icons/callouts/10.png +0 -0
  72. data/doc/images/icons/callouts/11.png +0 -0
  73. data/doc/images/icons/callouts/12.png +0 -0
  74. data/doc/images/icons/callouts/13.png +0 -0
  75. data/doc/images/icons/callouts/14.png +0 -0
  76. data/doc/images/icons/callouts/15.png +0 -0
  77. data/doc/images/icons/callouts/2.png +0 -0
  78. data/doc/images/icons/callouts/3.png +0 -0
  79. data/doc/images/icons/callouts/4.png +0 -0
  80. data/doc/images/icons/callouts/5.png +0 -0
  81. data/doc/images/icons/callouts/6.png +0 -0
  82. data/doc/images/icons/callouts/7.png +0 -0
  83. data/doc/images/icons/callouts/8.png +0 -0
  84. data/doc/images/icons/callouts/9.png +0 -0
  85. data/doc/images/icons/caution.png +0 -0
  86. data/doc/images/icons/example.png +0 -0
  87. data/doc/images/icons/home.png +0 -0
  88. data/doc/images/icons/important.png +0 -0
  89. data/doc/images/icons/next.png +0 -0
  90. data/doc/images/icons/note.png +0 -0
  91. data/doc/images/icons/prev.png +0 -0
  92. data/doc/images/icons/tip.png +0 -0
  93. data/doc/images/icons/up.png +0 -0
  94. data/doc/images/icons/warning.png +0 -0
  95. data/doc/images/passenger_architecture.png +0 -0
  96. data/doc/images/passenger_architecture.svg +401 -0
  97. data/doc/images/phusion_banner.png +0 -0
  98. data/doc/images/smart-lv2.png +0 -0
  99. data/doc/images/smart-lv2.svg +320 -0
  100. data/doc/images/spawn_server_architecture.png +0 -0
  101. data/doc/images/spawn_server_architecture.svg +655 -0
  102. data/doc/images/typical_isolated_web_application.png +0 -0
  103. data/doc/images/typical_isolated_web_application.svg +213 -0
  104. data/doc/rdoc/classes/ConditionVariable.html +215 -0
  105. data/doc/rdoc/classes/Exception.html +120 -0
  106. data/doc/rdoc/classes/GC.html +113 -0
  107. data/doc/rdoc/classes/IO.html +221 -0
  108. data/doc/rdoc/classes/PhusionPassenger.html +397 -0
  109. data/doc/rdoc/classes/PhusionPassenger/AbstractInstaller.html +180 -0
  110. data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +647 -0
  111. data/doc/rdoc/classes/PhusionPassenger/AbstractServer.html +654 -0
  112. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/InvalidPassword.html +92 -0
  113. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerAlreadyStarted.html +97 -0
  114. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerError.html +96 -0
  115. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/ServerNotStarted.html +97 -0
  116. data/doc/rdoc/classes/PhusionPassenger/AbstractServer/UnknownMessage.html +96 -0
  117. data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +619 -0
  118. data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +142 -0
  119. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats.html +368 -0
  120. data/doc/rdoc/classes/PhusionPassenger/AdminTools/MemoryStats/Process.html +231 -0
  121. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance.html +588 -0
  122. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/CorruptedDirectoryError.html +92 -0
  123. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/GenerationsAbsentError.html +92 -0
  124. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Group.html +147 -0
  125. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Process.html +279 -0
  126. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/RoleDeniedError.html +92 -0
  127. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/StaleDirectoryError.html +92 -0
  128. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/Stats.html +123 -0
  129. data/doc/rdoc/classes/PhusionPassenger/AdminTools/ServerInstance/UnsupportedGenerationStructureVersionError.html +92 -0
  130. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger.html +341 -0
  131. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/Log.html +294 -0
  132. data/doc/rdoc/classes/PhusionPassenger/AnalyticsLogger/SharedData.html +199 -0
  133. data/doc/rdoc/classes/PhusionPassenger/AppInitError.html +155 -0
  134. data/doc/rdoc/classes/PhusionPassenger/AppProcess.html +367 -0
  135. data/doc/rdoc/classes/PhusionPassenger/ClassicRails.html +95 -0
  136. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner.html +351 -0
  137. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/ApplicationSpawner/Error.html +98 -0
  138. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/CGIFixed.html +200 -0
  139. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner.html +410 -0
  140. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/FrameworkSpawner/Error.html +98 -0
  141. data/doc/rdoc/classes/PhusionPassenger/ClassicRails/RequestHandler.html +156 -0
  142. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions.html +115 -0
  143. data/doc/rdoc/classes/PhusionPassenger/ClassicRailsExtensions/AnalyticsLogging.html +202 -0
  144. data/doc/rdoc/classes/PhusionPassenger/ConsoleTextTemplate.html +172 -0
  145. data/doc/rdoc/classes/PhusionPassenger/DebugLogging.html +273 -0
  146. data/doc/rdoc/classes/PhusionPassenger/FrameworkInitError.html +145 -0
  147. data/doc/rdoc/classes/PhusionPassenger/HTMLTemplate.html +162 -0
  148. data/doc/rdoc/classes/PhusionPassenger/InitializationError.html +141 -0
  149. data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
  150. data/doc/rdoc/classes/PhusionPassenger/MessageChannel.html +673 -0
  151. data/doc/rdoc/classes/PhusionPassenger/MessageChannel/InvalidHashError.html +92 -0
  152. data/doc/rdoc/classes/PhusionPassenger/MessageClient.html +415 -0
  153. data/doc/rdoc/classes/PhusionPassenger/NativeSupportLoader.html +134 -0
  154. data/doc/rdoc/classes/PhusionPassenger/Packaging.html +129 -0
  155. data/doc/rdoc/classes/PhusionPassenger/PlatformInfo.html +1972 -0
  156. data/doc/rdoc/classes/PhusionPassenger/Plugin.html +237 -0
  157. data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
  158. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +312 -0
  159. data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner/Error.html +98 -0
  160. data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +218 -0
  161. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions.html +114 -0
  162. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging.html +259 -0
  163. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ACExtension.html +139 -0
  164. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ASBenchmarkableExtension.html +118 -0
  165. data/doc/rdoc/classes/PhusionPassenger/Rails3Extensions/AnalyticsLogging/ExceptionLogger.html +135 -0
  166. data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +378 -0
  167. data/doc/rdoc/classes/PhusionPassenger/Standalone.html +111 -0
  168. data/doc/rdoc/classes/PhusionPassenger/Standalone/AppFinder.html +252 -0
  169. data/doc/rdoc/classes/PhusionPassenger/Standalone/Command.html +161 -0
  170. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile.html +368 -0
  171. data/doc/rdoc/classes/PhusionPassenger/Standalone/ConfigFile/DisallowedContextError.html +132 -0
  172. data/doc/rdoc/classes/PhusionPassenger/Standalone/HelpCommand.html +151 -0
  173. data/doc/rdoc/classes/PhusionPassenger/Standalone/Main.html +189 -0
  174. data/doc/rdoc/classes/PhusionPassenger/Standalone/PackageRuntimeCommand.html +177 -0
  175. data/doc/rdoc/classes/PhusionPassenger/Standalone/RuntimeInstaller.html +341 -0
  176. data/doc/rdoc/classes/PhusionPassenger/Standalone/StartCommand.html +203 -0
  177. data/doc/rdoc/classes/PhusionPassenger/Standalone/StatusCommand.html +156 -0
  178. data/doc/rdoc/classes/PhusionPassenger/Standalone/StopCommand.html +168 -0
  179. data/doc/rdoc/classes/PhusionPassenger/Standalone/Utils.html +86 -0
  180. data/doc/rdoc/classes/PhusionPassenger/Standalone/VersionCommand.html +135 -0
  181. data/doc/rdoc/classes/PhusionPassenger/UnknownError.html +125 -0
  182. data/doc/rdoc/classes/PhusionPassenger/Utils.html +1543 -0
  183. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher.html +204 -0
  184. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/DirInfo.html +171 -0
  185. data/doc/rdoc/classes/PhusionPassenger/Utils/FileSystemWatcher/FileInfo.html +140 -0
  186. data/doc/rdoc/classes/PhusionPassenger/Utils/HostsFileParser.html +260 -0
  187. data/doc/rdoc/classes/PhusionPassenger/Utils/PseudoIO.html +169 -0
  188. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput.html +265 -0
  189. data/doc/rdoc/classes/PhusionPassenger/Utils/RewindableInput/Tempfile.html +120 -0
  190. data/doc/rdoc/classes/PhusionPassenger/Utils/UnseekableSocket.html +561 -0
  191. data/doc/rdoc/classes/PhusionPassenger/VersionNotFound.html +140 -0
  192. data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
  193. data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +182 -0
  194. data/doc/rdoc/classes/Process.html +115 -0
  195. data/doc/rdoc/classes/Signal.html +139 -0
  196. data/doc/rdoc/created.rid +1 -0
  197. data/doc/rdoc/files/DEVELOPERS_TXT.html +280 -0
  198. data/doc/rdoc/files/README.html +157 -0
  199. data/doc/rdoc/files/lib/phusion_passenger/abstract_installer_rb.html +130 -0
  200. data/doc/rdoc/files/lib/phusion_passenger/abstract_request_handler_rb.html +135 -0
  201. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +126 -0
  202. data/doc/rdoc/files/lib/phusion_passenger/abstract_server_rb.html +128 -0
  203. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/memory_stats_rb.html +126 -0
  204. data/doc/rdoc/files/lib/phusion_passenger/admin_tools/server_instance_rb.html +132 -0
  205. data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +122 -0
  206. data/doc/rdoc/files/lib/phusion_passenger/analytics_logger_rb.html +129 -0
  207. data/doc/rdoc/files/lib/phusion_passenger/app_process_rb.html +127 -0
  208. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/application_spawner_rb.html +141 -0
  209. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/cgi_fixed_rb.html +126 -0
  210. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/framework_spawner_rb.html +146 -0
  211. data/doc/rdoc/files/lib/phusion_passenger/classic_rails/request_handler_rb.html +125 -0
  212. data/doc/rdoc/files/lib/phusion_passenger/classic_rails_extensions/init_rb.html +132 -0
  213. data/doc/rdoc/files/lib/phusion_passenger/console_text_template_rb.html +126 -0
  214. data/doc/rdoc/files/lib/phusion_passenger/constants_rb.html +122 -0
  215. data/doc/rdoc/files/lib/phusion_passenger/debug_logging_rb.html +122 -0
  216. data/doc/rdoc/files/lib/phusion_passenger/dependencies_rb.html +147 -0
  217. data/doc/rdoc/files/lib/phusion_passenger/exceptions_rb.html +122 -0
  218. data/doc/rdoc/files/lib/phusion_passenger/html_template_rb.html +127 -0
  219. data/doc/rdoc/files/lib/phusion_passenger/message_channel_rb.html +120 -0
  220. data/doc/rdoc/files/lib/phusion_passenger/message_client_rb.html +127 -0
  221. data/doc/rdoc/files/lib/phusion_passenger/native_support_rb.html +132 -0
  222. data/doc/rdoc/files/lib/phusion_passenger/packaging_rb.html +122 -0
  223. data/doc/rdoc/files/lib/phusion_passenger/platform_info/apache_rb.html +127 -0
  224. data/doc/rdoc/files/lib/phusion_passenger/platform_info/binary_compatibility_rb.html +129 -0
  225. data/doc/rdoc/files/lib/phusion_passenger/platform_info/compiler_rb.html +127 -0
  226. data/doc/rdoc/files/lib/phusion_passenger/platform_info/curl_rb.html +126 -0
  227. data/doc/rdoc/files/lib/phusion_passenger/platform_info/documentation_tools_rb.html +126 -0
  228. data/doc/rdoc/files/lib/phusion_passenger/platform_info/linux_rb.html +126 -0
  229. data/doc/rdoc/files/lib/phusion_passenger/platform_info/operating_system_rb.html +127 -0
  230. data/doc/rdoc/files/lib/phusion_passenger/platform_info/ruby_rb.html +128 -0
  231. data/doc/rdoc/files/lib/phusion_passenger/platform_info/zlib_rb.html +126 -0
  232. data/doc/rdoc/files/lib/phusion_passenger/platform_info_rb.html +122 -0
  233. data/doc/rdoc/files/lib/phusion_passenger/plugin_rb.html +127 -0
  234. data/doc/rdoc/files/lib/phusion_passenger/public_api_rb.html +127 -0
  235. data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +137 -0
  236. data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +125 -0
  237. data/doc/rdoc/files/lib/phusion_passenger/rails3_extensions/init_rb.html +127 -0
  238. data/doc/rdoc/files/lib/phusion_passenger/simple_benchmarking_rb.html +122 -0
  239. data/doc/rdoc/files/lib/phusion_passenger/spawn_manager_rb.html +160 -0
  240. data/doc/rdoc/files/lib/phusion_passenger/standalone/app_finder_rb.html +127 -0
  241. data/doc/rdoc/files/lib/phusion_passenger/standalone/command_rb.html +136 -0
  242. data/doc/rdoc/files/lib/phusion_passenger/standalone/config_file_rb.html +126 -0
  243. data/doc/rdoc/files/lib/phusion_passenger/standalone/help_command_rb.html +126 -0
  244. data/doc/rdoc/files/lib/phusion_passenger/standalone/main_rb.html +126 -0
  245. data/doc/rdoc/files/lib/phusion_passenger/standalone/package_runtime_command_rb.html +127 -0
  246. data/doc/rdoc/files/lib/phusion_passenger/standalone/runtime_installer_rb.html +133 -0
  247. data/doc/rdoc/files/lib/phusion_passenger/standalone/start_command_rb.html +136 -0
  248. data/doc/rdoc/files/lib/phusion_passenger/standalone/status_command_rb.html +126 -0
  249. data/doc/rdoc/files/lib/phusion_passenger/standalone/stop_command_rb.html +126 -0
  250. data/doc/rdoc/files/lib/phusion_passenger/standalone/utils_rb.html +126 -0
  251. data/doc/rdoc/files/lib/phusion_passenger/standalone/version_command_rb.html +127 -0
  252. data/doc/rdoc/files/lib/phusion_passenger/utils/file_system_watcher_rb.html +126 -0
  253. data/doc/rdoc/files/lib/phusion_passenger/utils/hosts_file_parser_rb.html +120 -0
  254. data/doc/rdoc/files/lib/phusion_passenger/utils/rewindable_input_rb.html +100 -0
  255. data/doc/rdoc/files/lib/phusion_passenger/utils/tmpdir_rb.html +122 -0
  256. data/doc/rdoc/files/lib/phusion_passenger/utils/unseekable_socket_rb.html +126 -0
  257. data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +179 -0
  258. data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +132 -0
  259. data/doc/rdoc/fr_class_index.html +138 -0
  260. data/doc/rdoc/fr_file_index.html +108 -0
  261. data/doc/rdoc/fr_method_index.html +433 -0
  262. data/doc/rdoc/index.html +26 -0
  263. data/doc/rdoc/rdoc-style.css +187 -0
  264. data/doc/template/horo.rb +613 -0
  265. data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +201 -0
  266. data/doc/users_guide_snippets/appendix_a_about.txt +13 -0
  267. data/doc/users_guide_snippets/appendix_b_terminology.txt +63 -0
  268. data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +303 -0
  269. data/doc/users_guide_snippets/global_queueing_explained.txt +74 -0
  270. data/doc/users_guide_snippets/passenger_spawn_method.txt +49 -0
  271. data/doc/users_guide_snippets/rackup_specifications.txt +71 -0
  272. data/doc/users_guide_snippets/tips.txt +207 -0
  273. data/doc/users_guide_snippets/under_the_hood/page_caching_support.txt +22 -0
  274. data/ext/apache2/Bucket.cpp +190 -0
  275. data/ext/apache2/Bucket.h +87 -0
  276. data/ext/apache2/Configuration.cpp +717 -0
  277. data/ext/apache2/Configuration.h +51 -0
  278. data/ext/apache2/Configuration.hpp +462 -0
  279. data/ext/apache2/DirectoryMapper.h +280 -0
  280. data/ext/apache2/HelperAgent.cpp +365 -0
  281. data/ext/apache2/Hooks.cpp +1757 -0
  282. data/ext/apache2/Hooks.h +45 -0
  283. data/ext/apache2/mod_passenger.c +44 -0
  284. data/ext/boost/algorithm/string/case_conv.hpp +176 -0
  285. data/ext/boost/algorithm/string/compare.hpp +199 -0
  286. data/ext/boost/algorithm/string/concept.hpp +83 -0
  287. data/ext/boost/algorithm/string/config.hpp +28 -0
  288. data/ext/boost/algorithm/string/constants.hpp +36 -0
  289. data/ext/boost/algorithm/string/detail/case_conv.hpp +121 -0
  290. data/ext/boost/algorithm/string/detail/find_format.hpp +204 -0
  291. data/ext/boost/algorithm/string/detail/find_format_all.hpp +273 -0
  292. data/ext/boost/algorithm/string/detail/find_format_store.hpp +89 -0
  293. data/ext/boost/algorithm/string/detail/finder.hpp +646 -0
  294. data/ext/boost/algorithm/string/detail/formatter.hpp +94 -0
  295. data/ext/boost/algorithm/string/detail/replace_storage.hpp +159 -0
  296. data/ext/boost/algorithm/string/detail/sequence.hpp +200 -0
  297. data/ext/boost/algorithm/string/detail/util.hpp +106 -0
  298. data/ext/boost/algorithm/string/erase.hpp +844 -0
  299. data/ext/boost/algorithm/string/find_format.hpp +287 -0
  300. data/ext/boost/algorithm/string/finder.hpp +270 -0
  301. data/ext/boost/algorithm/string/formatter.hpp +103 -0
  302. data/ext/boost/algorithm/string/replace.hpp +928 -0
  303. data/ext/boost/algorithm/string/sequence_traits.hpp +193 -0
  304. data/ext/boost/algorithm/string/yes_no_type.hpp +33 -0
  305. data/ext/boost/assert.hpp +50 -0
  306. data/ext/boost/bind.hpp +24 -0
  307. data/ext/boost/bind/arg.hpp +62 -0
  308. data/ext/boost/bind/bind.hpp +1751 -0
  309. data/ext/boost/bind/bind_cc.hpp +117 -0
  310. data/ext/boost/bind/bind_mf2_cc.hpp +228 -0
  311. data/ext/boost/bind/bind_mf_cc.hpp +227 -0
  312. data/ext/boost/bind/bind_template.hpp +345 -0
  313. data/ext/boost/bind/mem_fn.hpp +389 -0
  314. data/ext/boost/bind/mem_fn_cc.hpp +103 -0
  315. data/ext/boost/bind/mem_fn_template.hpp +1047 -0
  316. data/ext/boost/bind/placeholders.hpp +69 -0
  317. data/ext/boost/bind/storage.hpp +475 -0
  318. data/ext/boost/call_traits.hpp +24 -0
  319. data/ext/boost/checked_delete.hpp +69 -0
  320. data/ext/boost/concept/assert.hpp +46 -0
  321. data/ext/boost/concept/detail/backward_compatibility.hpp +16 -0
  322. data/ext/boost/concept/detail/concept_def.hpp +51 -0
  323. data/ext/boost/concept/detail/concept_undef.hpp +5 -0
  324. data/ext/boost/concept/detail/general.hpp +75 -0
  325. data/ext/boost/concept/detail/has_constraints.hpp +50 -0
  326. data/ext/boost/concept/usage.hpp +44 -0
  327. data/ext/boost/concept_check.hpp +1007 -0
  328. data/ext/boost/config.hpp +70 -0
  329. data/ext/boost/config/abi/borland_prefix.hpp +27 -0
  330. data/ext/boost/config/abi/borland_suffix.hpp +12 -0
  331. data/ext/boost/config/abi/msvc_prefix.hpp +22 -0
  332. data/ext/boost/config/abi/msvc_suffix.hpp +8 -0
  333. data/ext/boost/config/abi_prefix.hpp +25 -0
  334. data/ext/boost/config/abi_suffix.hpp +27 -0
  335. data/ext/boost/config/auto_link.hpp +420 -0
  336. data/ext/boost/config/compiler/borland.hpp +275 -0
  337. data/ext/boost/config/compiler/clang.hpp +62 -0
  338. data/ext/boost/config/compiler/codegear.hpp +177 -0
  339. data/ext/boost/config/compiler/comeau.hpp +59 -0
  340. data/ext/boost/config/compiler/common_edg.hpp +99 -0
  341. data/ext/boost/config/compiler/compaq_cxx.hpp +19 -0
  342. data/ext/boost/config/compiler/digitalmars.hpp +93 -0
  343. data/ext/boost/config/compiler/gcc.hpp +243 -0
  344. data/ext/boost/config/compiler/gcc_xml.hpp +55 -0
  345. data/ext/boost/config/compiler/greenhills.hpp +28 -0
  346. data/ext/boost/config/compiler/hp_acc.hpp +127 -0
  347. data/ext/boost/config/compiler/intel.hpp +196 -0
  348. data/ext/boost/config/compiler/kai.hpp +33 -0
  349. data/ext/boost/config/compiler/metrowerks.hpp +139 -0
  350. data/ext/boost/config/compiler/mpw.hpp +81 -0
  351. data/ext/boost/config/compiler/nvcc.hpp +86 -0
  352. data/ext/boost/config/compiler/pgi.hpp +77 -0
  353. data/ext/boost/config/compiler/sgi_mipspro.hpp +29 -0
  354. data/ext/boost/config/compiler/sunpro_cc.hpp +144 -0
  355. data/ext/boost/config/compiler/vacpp.hpp +96 -0
  356. data/ext/boost/config/compiler/visualc.hpp +274 -0
  357. data/ext/boost/config/no_tr1/cmath.hpp +28 -0
  358. data/ext/boost/config/no_tr1/complex.hpp +28 -0
  359. data/ext/boost/config/no_tr1/functional.hpp +28 -0
  360. data/ext/boost/config/no_tr1/memory.hpp +28 -0
  361. data/ext/boost/config/no_tr1/utility.hpp +28 -0
  362. data/ext/boost/config/platform/aix.hpp +33 -0
  363. data/ext/boost/config/platform/amigaos.hpp +15 -0
  364. data/ext/boost/config/platform/beos.hpp +26 -0
  365. data/ext/boost/config/platform/bsd.hpp +86 -0
  366. data/ext/boost/config/platform/cygwin.hpp +48 -0
  367. data/ext/boost/config/platform/hpux.hpp +87 -0
  368. data/ext/boost/config/platform/irix.hpp +31 -0
  369. data/ext/boost/config/platform/linux.hpp +98 -0
  370. data/ext/boost/config/platform/macos.hpp +86 -0
  371. data/ext/boost/config/platform/qnxnto.hpp +31 -0
  372. data/ext/boost/config/platform/solaris.hpp +28 -0
  373. data/ext/boost/config/platform/symbian.hpp +94 -0
  374. data/ext/boost/config/platform/vxworks.hpp +31 -0
  375. data/ext/boost/config/platform/win32.hpp +65 -0
  376. data/ext/boost/config/posix_features.hpp +95 -0
  377. data/ext/boost/config/requires_threads.hpp +92 -0
  378. data/ext/boost/config/select_compiler_config.hpp +129 -0
  379. data/ext/boost/config/select_platform_config.hpp +98 -0
  380. data/ext/boost/config/select_stdlib_config.hpp +77 -0
  381. data/ext/boost/config/stdlib/dinkumware.hpp +148 -0
  382. data/ext/boost/config/stdlib/libcomo.hpp +72 -0
  383. data/ext/boost/config/stdlib/libstdcpp3.hpp +128 -0
  384. data/ext/boost/config/stdlib/modena.hpp +56 -0
  385. data/ext/boost/config/stdlib/msl.hpp +84 -0
  386. data/ext/boost/config/stdlib/roguewave.hpp +180 -0
  387. data/ext/boost/config/stdlib/sgi.hpp +137 -0
  388. data/ext/boost/config/stdlib/stlport.hpp +237 -0
  389. data/ext/boost/config/stdlib/vacpp.hpp +44 -0
  390. data/ext/boost/config/suffix.hpp +639 -0
  391. data/ext/boost/config/user.hpp +124 -0
  392. data/ext/boost/config/warning_disable.hpp +47 -0
  393. data/ext/boost/cstdint.hpp +504 -0
  394. data/ext/boost/current_function.hpp +67 -0
  395. data/ext/boost/date_time/adjust_functors.hpp +178 -0
  396. data/ext/boost/date_time/c_time.hpp +107 -0
  397. data/ext/boost/date_time/compiler_config.hpp +171 -0
  398. data/ext/boost/date_time/constrained_value.hpp +121 -0
  399. data/ext/boost/date_time/date.hpp +208 -0
  400. data/ext/boost/date_time/date_clock_device.hpp +77 -0
  401. data/ext/boost/date_time/date_defs.hpp +26 -0
  402. data/ext/boost/date_time/date_duration.hpp +146 -0
  403. data/ext/boost/date_time/date_duration_types.hpp +269 -0
  404. data/ext/boost/date_time/date_facet.hpp +764 -0
  405. data/ext/boost/date_time/date_format_simple.hpp +159 -0
  406. data/ext/boost/date_time/date_formatting.hpp +127 -0
  407. data/ext/boost/date_time/date_formatting_limited.hpp +121 -0
  408. data/ext/boost/date_time/date_formatting_locales.hpp +233 -0
  409. data/ext/boost/date_time/date_generator_formatter.hpp +265 -0
  410. data/ext/boost/date_time/date_generator_parser.hpp +330 -0
  411. data/ext/boost/date_time/date_generators.hpp +509 -0
  412. data/ext/boost/date_time/date_iterator.hpp +101 -0
  413. data/ext/boost/date_time/date_names_put.hpp +320 -0
  414. data/ext/boost/date_time/date_parsing.hpp +316 -0
  415. data/ext/boost/date_time/dst_rules.hpp +391 -0
  416. data/ext/boost/date_time/filetime_functions.hpp +170 -0
  417. data/ext/boost/date_time/format_date_parser.hpp +743 -0
  418. data/ext/boost/date_time/gregorian/conversion.hpp +68 -0
  419. data/ext/boost/date_time/gregorian/formatters.hpp +162 -0
  420. data/ext/boost/date_time/gregorian/formatters_limited.hpp +81 -0
  421. data/ext/boost/date_time/gregorian/greg_calendar.hpp +48 -0
  422. data/ext/boost/date_time/gregorian/greg_date.hpp +136 -0
  423. data/ext/boost/date_time/gregorian/greg_day.hpp +57 -0
  424. data/ext/boost/date_time/gregorian/greg_day_of_year.hpp +38 -0
  425. data/ext/boost/date_time/gregorian/greg_duration.hpp +134 -0
  426. data/ext/boost/date_time/gregorian/greg_duration_types.hpp +43 -0
  427. data/ext/boost/date_time/gregorian/greg_month.hpp +105 -0
  428. data/ext/boost/date_time/gregorian/greg_weekday.hpp +66 -0
  429. data/ext/boost/date_time/gregorian/greg_year.hpp +53 -0
  430. data/ext/boost/date_time/gregorian/greg_ymd.hpp +33 -0
  431. data/ext/boost/date_time/gregorian/gregorian.hpp +38 -0
  432. data/ext/boost/date_time/gregorian/gregorian_io.hpp +784 -0
  433. data/ext/boost/date_time/gregorian/gregorian_types.hpp +109 -0
  434. data/ext/boost/date_time/gregorian/parsers.hpp +91 -0
  435. data/ext/boost/date_time/gregorian_calendar.hpp +70 -0
  436. data/ext/boost/date_time/gregorian_calendar.ipp +219 -0
  437. data/ext/boost/date_time/int_adapter.hpp +509 -0
  438. data/ext/boost/date_time/iso_format.hpp +303 -0
  439. data/ext/boost/date_time/locale_config.hpp +31 -0
  440. data/ext/boost/date_time/microsec_time_clock.hpp +127 -0
  441. data/ext/boost/date_time/parse_format_base.hpp +29 -0
  442. data/ext/boost/date_time/period.hpp +377 -0
  443. data/ext/boost/date_time/period_formatter.hpp +196 -0
  444. data/ext/boost/date_time/period_parser.hpp +198 -0
  445. data/ext/boost/date_time/posix_time/conversion.hpp +94 -0
  446. data/ext/boost/date_time/posix_time/date_duration_operators.hpp +114 -0
  447. data/ext/boost/date_time/posix_time/posix_time.hpp +39 -0
  448. data/ext/boost/date_time/posix_time/posix_time_config.hpp +178 -0
  449. data/ext/boost/date_time/posix_time/posix_time_duration.hpp +82 -0
  450. data/ext/boost/date_time/posix_time/posix_time_io.hpp +239 -0
  451. data/ext/boost/date_time/posix_time/posix_time_system.hpp +68 -0
  452. data/ext/boost/date_time/posix_time/posix_time_types.hpp +55 -0
  453. data/ext/boost/date_time/posix_time/ptime.hpp +65 -0
  454. data/ext/boost/date_time/posix_time/time_formatters.hpp +289 -0
  455. data/ext/boost/date_time/posix_time/time_parsers.hpp +44 -0
  456. data/ext/boost/date_time/posix_time/time_period.hpp +29 -0
  457. data/ext/boost/date_time/special_defs.hpp +25 -0
  458. data/ext/boost/date_time/special_values_formatter.hpp +96 -0
  459. data/ext/boost/date_time/special_values_parser.hpp +159 -0
  460. data/ext/boost/date_time/string_convert.hpp +33 -0
  461. data/ext/boost/date_time/string_parse_tree.hpp +278 -0
  462. data/ext/boost/date_time/strings_from_facet.hpp +125 -0
  463. data/ext/boost/date_time/time.hpp +191 -0
  464. data/ext/boost/date_time/time_clock.hpp +83 -0
  465. data/ext/boost/date_time/time_defs.hpp +43 -0
  466. data/ext/boost/date_time/time_duration.hpp +282 -0
  467. data/ext/boost/date_time/time_facet.hpp +1367 -0
  468. data/ext/boost/date_time/time_formatting_streams.hpp +122 -0
  469. data/ext/boost/date_time/time_iterator.hpp +52 -0
  470. data/ext/boost/date_time/time_parsing.hpp +321 -0
  471. data/ext/boost/date_time/time_resolution_traits.hpp +144 -0
  472. data/ext/boost/date_time/time_system_counted.hpp +254 -0
  473. data/ext/boost/date_time/time_system_split.hpp +207 -0
  474. data/ext/boost/date_time/wrapping_int.hpp +169 -0
  475. data/ext/boost/date_time/year_month_day.hpp +45 -0
  476. data/ext/boost/detail/call_traits.hpp +164 -0
  477. data/ext/boost/detail/endian.hpp +76 -0
  478. data/ext/boost/detail/indirect_traits.hpp +487 -0
  479. data/ext/boost/detail/iterator.hpp +494 -0
  480. data/ext/boost/detail/lcast_precision.hpp +184 -0
  481. data/ext/boost/detail/limits.hpp +449 -0
  482. data/ext/boost/detail/no_exceptions_support.hpp +87 -0
  483. data/ext/boost/detail/reference_content.hpp +141 -0
  484. data/ext/boost/detail/sp_typeinfo.hpp +129 -0
  485. data/ext/boost/detail/workaround.hpp +267 -0
  486. data/ext/boost/enable_shared_from_this.hpp +18 -0
  487. data/ext/boost/exception/current_exception_cast.hpp +43 -0
  488. data/ext/boost/exception/detail/attribute_noreturn.hpp +17 -0
  489. data/ext/boost/exception/detail/error_info_impl.hpp +75 -0
  490. data/ext/boost/exception/detail/exception_ptr.hpp +431 -0
  491. data/ext/boost/exception/detail/is_output_streamable.hpp +60 -0
  492. data/ext/boost/exception/detail/object_hex_dump.hpp +50 -0
  493. data/ext/boost/exception/detail/type_info.hpp +83 -0
  494. data/ext/boost/exception/diagnostic_information.hpp +184 -0
  495. data/ext/boost/exception/exception.hpp +436 -0
  496. data/ext/boost/exception/get_error_info.hpp +130 -0
  497. data/ext/boost/exception/info.hpp +200 -0
  498. data/ext/boost/exception/to_string.hpp +83 -0
  499. data/ext/boost/exception/to_string_stub.hpp +109 -0
  500. data/ext/boost/exception_ptr.hpp +11 -0
  501. data/ext/boost/function.hpp +66 -0
  502. data/ext/boost/function/detail/function_iterate.hpp +16 -0
  503. data/ext/boost/function/detail/maybe_include.hpp +267 -0
  504. data/ext/boost/function/detail/prologue.hpp +26 -0
  505. data/ext/boost/function/function_base.hpp +904 -0
  506. data/ext/boost/function/function_fwd.hpp +70 -0
  507. data/ext/boost/function/function_template.hpp +1158 -0
  508. data/ext/boost/function_equal.hpp +28 -0
  509. data/ext/boost/get_pointer.hpp +33 -0
  510. data/ext/boost/implicit_cast.hpp +29 -0
  511. data/ext/boost/integer.hpp +257 -0
  512. data/ext/boost/integer_fwd.hpp +180 -0
  513. data/ext/boost/integer_traits.hpp +261 -0
  514. data/ext/boost/io/ios_state.hpp +439 -0
  515. data/ext/boost/io_fwd.hpp +67 -0
  516. data/ext/boost/is_placeholder.hpp +31 -0
  517. data/ext/boost/iterator.hpp +59 -0
  518. data/ext/boost/iterator/detail/config_def.hpp +137 -0
  519. data/ext/boost/iterator/detail/config_undef.hpp +25 -0
  520. data/ext/boost/iterator/detail/enable_if.hpp +86 -0
  521. data/ext/boost/iterator/detail/facade_iterator_category.hpp +200 -0
  522. data/ext/boost/iterator/detail/minimum_category.hpp +116 -0
  523. data/ext/boost/iterator/interoperable.hpp +50 -0
  524. data/ext/boost/iterator/iterator_adaptor.hpp +371 -0
  525. data/ext/boost/iterator/iterator_categories.hpp +188 -0
  526. data/ext/boost/iterator/iterator_concepts.hpp +284 -0
  527. data/ext/boost/iterator/iterator_facade.hpp +878 -0
  528. data/ext/boost/iterator/iterator_traits.hpp +92 -0
  529. data/ext/boost/iterator/reverse_iterator.hpp +69 -0
  530. data/ext/boost/iterator/transform_iterator.hpp +187 -0
  531. data/ext/boost/lexical_cast.hpp +1213 -0
  532. data/ext/boost/limits.hpp +146 -0
  533. data/ext/boost/make_shared.hpp +17 -0
  534. data/ext/boost/mem_fn.hpp +24 -0
  535. data/ext/boost/memory_order.hpp +53 -0
  536. data/ext/boost/mpl/always.hpp +39 -0
  537. data/ext/boost/mpl/and.hpp +60 -0
  538. data/ext/boost/mpl/apply.hpp +229 -0
  539. data/ext/boost/mpl/apply_fwd.hpp +107 -0
  540. data/ext/boost/mpl/apply_wrap.hpp +234 -0
  541. data/ext/boost/mpl/arg.hpp +131 -0
  542. data/ext/boost/mpl/arg_fwd.hpp +28 -0
  543. data/ext/boost/mpl/assert.hpp +370 -0
  544. data/ext/boost/mpl/aux_/adl_barrier.hpp +48 -0
  545. data/ext/boost/mpl/aux_/arg_typedef.hpp +31 -0
  546. data/ext/boost/mpl/aux_/arity.hpp +39 -0
  547. data/ext/boost/mpl/aux_/arity_spec.hpp +67 -0
  548. data/ext/boost/mpl/aux_/common_name_wknd.hpp +34 -0
  549. data/ext/boost/mpl/aux_/config/adl.hpp +40 -0
  550. data/ext/boost/mpl/aux_/config/arrays.hpp +30 -0
  551. data/ext/boost/mpl/aux_/config/bcc.hpp +28 -0
  552. data/ext/boost/mpl/aux_/config/bind.hpp +33 -0
  553. data/ext/boost/mpl/aux_/config/compiler.hpp +66 -0
  554. data/ext/boost/mpl/aux_/config/ctps.hpp +30 -0
  555. data/ext/boost/mpl/aux_/config/dtp.hpp +46 -0
  556. data/ext/boost/mpl/aux_/config/eti.hpp +47 -0
  557. data/ext/boost/mpl/aux_/config/gcc.hpp +23 -0
  558. data/ext/boost/mpl/aux_/config/has_apply.hpp +32 -0
  559. data/ext/boost/mpl/aux_/config/has_xxx.hpp +34 -0
  560. data/ext/boost/mpl/aux_/config/integral.hpp +38 -0
  561. data/ext/boost/mpl/aux_/config/intel.hpp +21 -0
  562. data/ext/boost/mpl/aux_/config/lambda.hpp +32 -0
  563. data/ext/boost/mpl/aux_/config/msvc.hpp +21 -0
  564. data/ext/boost/mpl/aux_/config/msvc_typename.hpp +26 -0
  565. data/ext/boost/mpl/aux_/config/nttp.hpp +41 -0
  566. data/ext/boost/mpl/aux_/config/overload_resolution.hpp +29 -0
  567. data/ext/boost/mpl/aux_/config/pp_counter.hpp +26 -0
  568. data/ext/boost/mpl/aux_/config/preprocessor.hpp +39 -0
  569. data/ext/boost/mpl/aux_/config/static_constant.hpp +25 -0
  570. data/ext/boost/mpl/aux_/config/ttp.hpp +41 -0
  571. data/ext/boost/mpl/aux_/config/use_preprocessed.hpp +19 -0
  572. data/ext/boost/mpl/aux_/config/workaround.hpp +19 -0
  573. data/ext/boost/mpl/aux_/full_lambda.hpp +354 -0
  574. data/ext/boost/mpl/aux_/has_apply.hpp +32 -0
  575. data/ext/boost/mpl/aux_/has_type.hpp +23 -0
  576. data/ext/boost/mpl/aux_/include_preprocessed.hpp +42 -0
  577. data/ext/boost/mpl/aux_/integral_wrapper.hpp +93 -0
  578. data/ext/boost/mpl/aux_/lambda_arity_param.hpp +25 -0
  579. data/ext/boost/mpl/aux_/lambda_support.hpp +169 -0
  580. data/ext/boost/mpl/aux_/msvc_never_true.hpp +34 -0
  581. data/ext/boost/mpl/aux_/na.hpp +95 -0
  582. data/ext/boost/mpl/aux_/na_assert.hpp +34 -0
  583. data/ext/boost/mpl/aux_/na_fwd.hpp +31 -0
  584. data/ext/boost/mpl/aux_/na_spec.hpp +175 -0
  585. data/ext/boost/mpl/aux_/nested_type_wknd.hpp +48 -0
  586. data/ext/boost/mpl/aux_/nttp_decl.hpp +35 -0
  587. data/ext/boost/mpl/aux_/preprocessed/gcc/and.hpp +69 -0
  588. data/ext/boost/mpl/aux_/preprocessed/gcc/apply.hpp +169 -0
  589. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_fwd.hpp +52 -0
  590. data/ext/boost/mpl/aux_/preprocessed/gcc/apply_wrap.hpp +84 -0
  591. data/ext/boost/mpl/aux_/preprocessed/gcc/arg.hpp +123 -0
  592. data/ext/boost/mpl/aux_/preprocessed/gcc/bind.hpp +561 -0
  593. data/ext/boost/mpl/aux_/preprocessed/gcc/bind_fwd.hpp +52 -0
  594. data/ext/boost/mpl/aux_/preprocessed/gcc/full_lambda.hpp +558 -0
  595. data/ext/boost/mpl/aux_/preprocessed/gcc/or.hpp +69 -0
  596. data/ext/boost/mpl/aux_/preprocessed/gcc/placeholders.hpp +105 -0
  597. data/ext/boost/mpl/aux_/preprocessed/gcc/quote.hpp +123 -0
  598. data/ext/boost/mpl/aux_/preprocessed/gcc/template_arity.hpp +97 -0
  599. data/ext/boost/mpl/aux_/preprocessor/def_params_tail.hpp +105 -0
  600. data/ext/boost/mpl/aux_/preprocessor/enum.hpp +62 -0
  601. data/ext/boost/mpl/aux_/preprocessor/filter_params.hpp +28 -0
  602. data/ext/boost/mpl/aux_/preprocessor/params.hpp +65 -0
  603. data/ext/boost/mpl/aux_/preprocessor/sub.hpp +65 -0
  604. data/ext/boost/mpl/aux_/static_cast.hpp +27 -0
  605. data/ext/boost/mpl/aux_/template_arity.hpp +189 -0
  606. data/ext/boost/mpl/aux_/template_arity_fwd.hpp +23 -0
  607. data/ext/boost/mpl/aux_/type_wrapper.hpp +47 -0
  608. data/ext/boost/mpl/aux_/value_wknd.hpp +89 -0
  609. data/ext/boost/mpl/aux_/yes_no.hpp +58 -0
  610. data/ext/boost/mpl/bind.hpp +551 -0
  611. data/ext/boost/mpl/bind_fwd.hpp +99 -0
  612. data/ext/boost/mpl/bool.hpp +39 -0
  613. data/ext/boost/mpl/bool_fwd.hpp +33 -0
  614. data/ext/boost/mpl/eval_if.hpp +71 -0
  615. data/ext/boost/mpl/has_xxx.hpp +640 -0
  616. data/ext/boost/mpl/identity.hpp +45 -0
  617. data/ext/boost/mpl/if.hpp +135 -0
  618. data/ext/boost/mpl/int.hpp +22 -0
  619. data/ext/boost/mpl/int_fwd.hpp +27 -0
  620. data/ext/boost/mpl/integral_c.hpp +51 -0
  621. data/ext/boost/mpl/integral_c_fwd.hpp +32 -0
  622. data/ext/boost/mpl/integral_c_tag.hpp +26 -0
  623. data/ext/boost/mpl/lambda.hpp +29 -0
  624. data/ext/boost/mpl/lambda_fwd.hpp +57 -0
  625. data/ext/boost/mpl/limits/arity.hpp +21 -0
  626. data/ext/boost/mpl/logical.hpp +21 -0
  627. data/ext/boost/mpl/next.hpp +19 -0
  628. data/ext/boost/mpl/next_prior.hpp +49 -0
  629. data/ext/boost/mpl/not.hpp +51 -0
  630. data/ext/boost/mpl/or.hpp +61 -0
  631. data/ext/boost/mpl/placeholders.hpp +100 -0
  632. data/ext/boost/mpl/protect.hpp +55 -0
  633. data/ext/boost/mpl/quote.hpp +151 -0
  634. data/ext/boost/mpl/size_t.hpp +25 -0
  635. data/ext/boost/mpl/size_t_fwd.hpp +28 -0
  636. data/ext/boost/mpl/void.hpp +76 -0
  637. data/ext/boost/mpl/void_fwd.hpp +26 -0
  638. data/ext/boost/next_prior.hpp +51 -0
  639. data/ext/boost/non_type.hpp +27 -0
  640. data/ext/boost/noncopyable.hpp +36 -0
  641. data/ext/boost/none.hpp +28 -0
  642. data/ext/boost/none_t.hpp +24 -0
  643. data/ext/boost/operators.hpp +976 -0
  644. data/ext/boost/optional.hpp +18 -0
  645. data/ext/boost/optional/optional.hpp +924 -0
  646. data/ext/boost/optional/optional_fwd.hpp +22 -0
  647. data/ext/boost/preprocessor/arithmetic/add.hpp +51 -0
  648. data/ext/boost/preprocessor/arithmetic/dec.hpp +288 -0
  649. data/ext/boost/preprocessor/arithmetic/detail/div_base.hpp +61 -0
  650. data/ext/boost/preprocessor/arithmetic/inc.hpp +288 -0
  651. data/ext/boost/preprocessor/arithmetic/mod.hpp +39 -0
  652. data/ext/boost/preprocessor/arithmetic/sub.hpp +50 -0
  653. data/ext/boost/preprocessor/array/data.hpp +28 -0
  654. data/ext/boost/preprocessor/array/elem.hpp +29 -0
  655. data/ext/boost/preprocessor/array/size.hpp +28 -0
  656. data/ext/boost/preprocessor/cat.hpp +35 -0
  657. data/ext/boost/preprocessor/comma_if.hpp +17 -0
  658. data/ext/boost/preprocessor/comparison/less_equal.hpp +39 -0
  659. data/ext/boost/preprocessor/config/config.hpp +70 -0
  660. data/ext/boost/preprocessor/control/deduce_d.hpp +22 -0
  661. data/ext/boost/preprocessor/control/detail/while.hpp +536 -0
  662. data/ext/boost/preprocessor/control/expr_iif.hpp +31 -0
  663. data/ext/boost/preprocessor/control/if.hpp +30 -0
  664. data/ext/boost/preprocessor/control/iif.hpp +34 -0
  665. data/ext/boost/preprocessor/control/while.hpp +312 -0
  666. data/ext/boost/preprocessor/debug/error.hpp +33 -0
  667. data/ext/boost/preprocessor/detail/auto_rec.hpp +293 -0
  668. data/ext/boost/preprocessor/detail/check.hpp +48 -0
  669. data/ext/boost/preprocessor/detail/is_binary.hpp +30 -0
  670. data/ext/boost/preprocessor/empty.hpp +17 -0
  671. data/ext/boost/preprocessor/enum.hpp +17 -0
  672. data/ext/boost/preprocessor/enum_params.hpp +17 -0
  673. data/ext/boost/preprocessor/facilities/empty.hpp +21 -0
  674. data/ext/boost/preprocessor/facilities/identity.hpp +23 -0
  675. data/ext/boost/preprocessor/identity.hpp +17 -0
  676. data/ext/boost/preprocessor/inc.hpp +17 -0
  677. data/ext/boost/preprocessor/iterate.hpp +17 -0
  678. data/ext/boost/preprocessor/iteration/detail/bounds/lower1.hpp +99 -0
  679. data/ext/boost/preprocessor/iteration/detail/bounds/upper1.hpp +99 -0
  680. data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +1342 -0
  681. data/ext/boost/preprocessor/iteration/iterate.hpp +82 -0
  682. data/ext/boost/preprocessor/list/adt.hpp +73 -0
  683. data/ext/boost/preprocessor/list/append.hpp +40 -0
  684. data/ext/boost/preprocessor/list/detail/fold_left.hpp +279 -0
  685. data/ext/boost/preprocessor/list/detail/fold_right.hpp +277 -0
  686. data/ext/boost/preprocessor/list/fold_left.hpp +303 -0
  687. data/ext/boost/preprocessor/list/fold_right.hpp +40 -0
  688. data/ext/boost/preprocessor/list/for_each_i.hpp +65 -0
  689. data/ext/boost/preprocessor/list/reverse.hpp +40 -0
  690. data/ext/boost/preprocessor/list/transform.hpp +49 -0
  691. data/ext/boost/preprocessor/logical/and.hpp +30 -0
  692. data/ext/boost/preprocessor/logical/bitand.hpp +38 -0
  693. data/ext/boost/preprocessor/logical/bool.hpp +288 -0
  694. data/ext/boost/preprocessor/logical/compl.hpp +36 -0
  695. data/ext/boost/preprocessor/logical/not.hpp +30 -0
  696. data/ext/boost/preprocessor/punctuation/comma.hpp +21 -0
  697. data/ext/boost/preprocessor/punctuation/comma_if.hpp +31 -0
  698. data/ext/boost/preprocessor/repeat.hpp +17 -0
  699. data/ext/boost/preprocessor/repetition/detail/for.hpp +536 -0
  700. data/ext/boost/preprocessor/repetition/enum.hpp +66 -0
  701. data/ext/boost/preprocessor/repetition/enum_binary_params.hpp +54 -0
  702. data/ext/boost/preprocessor/repetition/enum_params.hpp +41 -0
  703. data/ext/boost/preprocessor/repetition/enum_trailing_params.hpp +38 -0
  704. data/ext/boost/preprocessor/repetition/for.hpp +306 -0
  705. data/ext/boost/preprocessor/repetition/repeat.hpp +825 -0
  706. data/ext/boost/preprocessor/repetition/repeat_from_to.hpp +87 -0
  707. data/ext/boost/preprocessor/seq/cat.hpp +48 -0
  708. data/ext/boost/preprocessor/seq/elem.hpp +304 -0
  709. data/ext/boost/preprocessor/seq/enum.hpp +288 -0
  710. data/ext/boost/preprocessor/seq/fold_left.hpp +1070 -0
  711. data/ext/boost/preprocessor/seq/for_each_i.hpp +61 -0
  712. data/ext/boost/preprocessor/seq/seq.hpp +44 -0
  713. data/ext/boost/preprocessor/seq/size.hpp +548 -0
  714. data/ext/boost/preprocessor/seq/transform.hpp +48 -0
  715. data/ext/boost/preprocessor/slot/detail/def.hpp +49 -0
  716. data/ext/boost/preprocessor/slot/detail/shared.hpp +247 -0
  717. data/ext/boost/preprocessor/slot/slot.hpp +32 -0
  718. data/ext/boost/preprocessor/stringize.hpp +33 -0
  719. data/ext/boost/preprocessor/tuple/eat.hpp +57 -0
  720. data/ext/boost/preprocessor/tuple/elem.hpp +385 -0
  721. data/ext/boost/preprocessor/tuple/rem.hpp +72 -0
  722. data/ext/boost/preprocessor/tuple/to_list.hpp +62 -0
  723. data/ext/boost/range/algorithm/equal.hpp +188 -0
  724. data/ext/boost/range/as_literal.hpp +127 -0
  725. data/ext/boost/range/begin.hpp +132 -0
  726. data/ext/boost/range/concepts.hpp +331 -0
  727. data/ext/boost/range/config.hpp +54 -0
  728. data/ext/boost/range/const_iterator.hpp +67 -0
  729. data/ext/boost/range/detail/common.hpp +117 -0
  730. data/ext/boost/range/detail/extract_optional_type.hpp +52 -0
  731. data/ext/boost/range/detail/implementation_help.hpp +103 -0
  732. data/ext/boost/range/detail/misc_concept.hpp +33 -0
  733. data/ext/boost/range/detail/sfinae.hpp +77 -0
  734. data/ext/boost/range/detail/str_types.hpp +38 -0
  735. data/ext/boost/range/difference_type.hpp +29 -0
  736. data/ext/boost/range/distance.hpp +34 -0
  737. data/ext/boost/range/empty.hpp +34 -0
  738. data/ext/boost/range/end.hpp +131 -0
  739. data/ext/boost/range/functions.hpp +27 -0
  740. data/ext/boost/range/iterator.hpp +72 -0
  741. data/ext/boost/range/iterator_range.hpp +16 -0
  742. data/ext/boost/range/iterator_range_core.hpp +542 -0
  743. data/ext/boost/range/iterator_range_io.hpp +93 -0
  744. data/ext/boost/range/mutable_iterator.hpp +67 -0
  745. data/ext/boost/range/rbegin.hpp +65 -0
  746. data/ext/boost/range/rend.hpp +65 -0
  747. data/ext/boost/range/reverse_iterator.hpp +40 -0
  748. data/ext/boost/range/size.hpp +36 -0
  749. data/ext/boost/range/size_type.hpp +79 -0
  750. data/ext/boost/range/value_type.hpp +34 -0
  751. data/ext/boost/ref.hpp +189 -0
  752. data/ext/boost/scoped_array.hpp +16 -0
  753. data/ext/boost/scoped_ptr.hpp +16 -0
  754. data/ext/boost/shared_array.hpp +19 -0
  755. data/ext/boost/shared_ptr.hpp +19 -0
  756. data/ext/boost/smart_ptr/bad_weak_ptr.hpp +59 -0
  757. data/ext/boost/smart_ptr/detail/atomic_count.hpp +119 -0
  758. data/ext/boost/smart_ptr/detail/atomic_count_gcc.hpp +72 -0
  759. data/ext/boost/smart_ptr/detail/atomic_count_gcc_x86.hpp +77 -0
  760. data/ext/boost/smart_ptr/detail/atomic_count_pthreads.hpp +96 -0
  761. data/ext/boost/smart_ptr/detail/atomic_count_solaris.hpp +59 -0
  762. data/ext/boost/smart_ptr/detail/atomic_count_sync.hpp +61 -0
  763. data/ext/boost/smart_ptr/detail/atomic_count_win32.hpp +63 -0
  764. data/ext/boost/smart_ptr/detail/operator_bool.hpp +56 -0
  765. data/ext/boost/smart_ptr/detail/shared_count.hpp +444 -0
  766. data/ext/boost/smart_ptr/detail/sp_convertible.hpp +76 -0
  767. data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +70 -0
  768. data/ext/boost/smart_ptr/detail/sp_counted_base_acc_ia64.hpp +150 -0
  769. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_ppc.hpp +170 -0
  770. data/ext/boost/smart_ptr/detail/sp_counted_base_cw_x86.hpp +158 -0
  771. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ia64.hpp +157 -0
  772. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +172 -0
  773. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp +181 -0
  774. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_sparc.hpp +166 -0
  775. data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp +173 -0
  776. data/ext/boost/smart_ptr/detail/sp_counted_base_nt.hpp +107 -0
  777. data/ext/boost/smart_ptr/detail/sp_counted_base_pt.hpp +135 -0
  778. data/ext/boost/smart_ptr/detail/sp_counted_base_solaris.hpp +113 -0
  779. data/ext/boost/smart_ptr/detail/sp_counted_base_spin.hpp +131 -0
  780. data/ext/boost/smart_ptr/detail/sp_counted_base_sync.hpp +155 -0
  781. data/ext/boost/smart_ptr/detail/sp_counted_base_w32.hpp +130 -0
  782. data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +231 -0
  783. data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +49 -0
  784. data/ext/boost/smart_ptr/detail/spinlock.hpp +53 -0
  785. data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +85 -0
  786. data/ext/boost/smart_ptr/detail/spinlock_nt.hpp +89 -0
  787. data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +87 -0
  788. data/ext/boost/smart_ptr/detail/spinlock_pt.hpp +79 -0
  789. data/ext/boost/smart_ptr/detail/spinlock_sync.hpp +87 -0
  790. data/ext/boost/smart_ptr/detail/yield_k.hpp +149 -0
  791. data/ext/boost/smart_ptr/enable_shared_from_this.hpp +79 -0
  792. data/ext/boost/smart_ptr/make_shared.hpp +508 -0
  793. data/ext/boost/smart_ptr/scoped_array.hpp +107 -0
  794. data/ext/boost/smart_ptr/scoped_ptr.hpp +131 -0
  795. data/ext/boost/smart_ptr/shared_array.hpp +147 -0
  796. data/ext/boost/smart_ptr/shared_ptr.hpp +701 -0
  797. data/ext/boost/smart_ptr/weak_ptr.hpp +230 -0
  798. data/ext/boost/src/pthread/once.cpp +51 -0
  799. data/ext/boost/src/pthread/thread.cpp +616 -0
  800. data/ext/boost/src/pthread/timeconv.inl +133 -0
  801. data/ext/boost/src/tss_null.cpp +34 -0
  802. data/ext/boost/static_assert.hpp +132 -0
  803. data/ext/boost/thread.hpp +26 -0
  804. data/ext/boost/thread/barrier.hpp +64 -0
  805. data/ext/boost/thread/condition.hpp +16 -0
  806. data/ext/boost/thread/condition_variable.hpp +21 -0
  807. data/ext/boost/thread/detail/config.hpp +100 -0
  808. data/ext/boost/thread/detail/force_cast.hpp +39 -0
  809. data/ext/boost/thread/detail/move.hpp +60 -0
  810. data/ext/boost/thread/detail/platform.hpp +71 -0
  811. data/ext/boost/thread/detail/singleton.hpp +59 -0
  812. data/ext/boost/thread/detail/thread.hpp +540 -0
  813. data/ext/boost/thread/detail/thread_group.hpp +108 -0
  814. data/ext/boost/thread/detail/thread_heap_alloc.hpp +23 -0
  815. data/ext/boost/thread/detail/thread_interruption.hpp +35 -0
  816. data/ext/boost/thread/detail/tss_hooks.hpp +65 -0
  817. data/ext/boost/thread/exceptions.hpp +223 -0
  818. data/ext/boost/thread/future.hpp +1375 -0
  819. data/ext/boost/thread/locks.hpp +1585 -0
  820. data/ext/boost/thread/mutex.hpp +21 -0
  821. data/ext/boost/thread/once.hpp +33 -0
  822. data/ext/boost/thread/pthread/condition_variable.hpp +179 -0
  823. data/ext/boost/thread/pthread/condition_variable_fwd.hpp +102 -0
  824. data/ext/boost/thread/pthread/mutex.hpp +236 -0
  825. data/ext/boost/thread/pthread/once.hpp +95 -0
  826. data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +54 -0
  827. data/ext/boost/thread/pthread/recursive_mutex.hpp +345 -0
  828. data/ext/boost/thread/pthread/shared_mutex.hpp +303 -0
  829. data/ext/boost/thread/pthread/thread_data.hpp +129 -0
  830. data/ext/boost/thread/pthread/thread_heap_alloc.hpp +242 -0
  831. data/ext/boost/thread/pthread/timespec.hpp +36 -0
  832. data/ext/boost/thread/recursive_mutex.hpp +21 -0
  833. data/ext/boost/thread/shared_mutex.hpp +21 -0
  834. data/ext/boost/thread/thread.hpp +27 -0
  835. data/ext/boost/thread/thread_time.hpp +50 -0
  836. data/ext/boost/thread/tss.hpp +113 -0
  837. data/ext/boost/thread/xtime.hpp +92 -0
  838. data/ext/boost/throw_exception.hpp +91 -0
  839. data/ext/boost/token_functions.hpp +641 -0
  840. data/ext/boost/token_iterator.hpp +128 -0
  841. data/ext/boost/tokenizer.hpp +98 -0
  842. data/ext/boost/type.hpp +18 -0
  843. data/ext/boost/type_traits/add_const.hpp +47 -0
  844. data/ext/boost/type_traits/add_pointer.hpp +72 -0
  845. data/ext/boost/type_traits/add_reference.hpp +107 -0
  846. data/ext/boost/type_traits/add_volatile.hpp +47 -0
  847. data/ext/boost/type_traits/alignment_of.hpp +128 -0
  848. data/ext/boost/type_traits/broken_compiler_spec.hpp +117 -0
  849. data/ext/boost/type_traits/composite_traits.hpp +29 -0
  850. data/ext/boost/type_traits/config.hpp +76 -0
  851. data/ext/boost/type_traits/conversion_traits.hpp +17 -0
  852. data/ext/boost/type_traits/detail/bool_trait_def.hpp +173 -0
  853. data/ext/boost/type_traits/detail/bool_trait_undef.hpp +27 -0
  854. data/ext/boost/type_traits/detail/cv_traits_impl.hpp +97 -0
  855. data/ext/boost/type_traits/detail/false_result.hpp +28 -0
  856. data/ext/boost/type_traits/detail/ice_and.hpp +35 -0
  857. data/ext/boost/type_traits/detail/ice_eq.hpp +36 -0
  858. data/ext/boost/type_traits/detail/ice_not.hpp +31 -0
  859. data/ext/boost/type_traits/detail/ice_or.hpp +34 -0
  860. data/ext/boost/type_traits/detail/is_function_ptr_helper.hpp +220 -0
  861. data/ext/boost/type_traits/detail/is_mem_fun_pointer_impl.hpp +817 -0
  862. data/ext/boost/type_traits/detail/size_t_trait_def.hpp +58 -0
  863. data/ext/boost/type_traits/detail/size_t_trait_undef.hpp +16 -0
  864. data/ext/boost/type_traits/detail/template_arity_spec.hpp +31 -0
  865. data/ext/boost/type_traits/detail/type_trait_def.hpp +61 -0
  866. data/ext/boost/type_traits/detail/type_trait_undef.hpp +19 -0
  867. data/ext/boost/type_traits/detail/yes_no_type.hpp +26 -0
  868. data/ext/boost/type_traits/function_traits.hpp +236 -0
  869. data/ext/boost/type_traits/has_nothrow_copy.hpp +39 -0
  870. data/ext/boost/type_traits/has_trivial_copy.hpp +49 -0
  871. data/ext/boost/type_traits/has_trivial_destructor.hpp +42 -0
  872. data/ext/boost/type_traits/ice.hpp +20 -0
  873. data/ext/boost/type_traits/integral_constant.hpp +53 -0
  874. data/ext/boost/type_traits/intrinsics.hpp +240 -0
  875. data/ext/boost/type_traits/is_abstract.hpp +153 -0
  876. data/ext/boost/type_traits/is_arithmetic.hpp +51 -0
  877. data/ext/boost/type_traits/is_array.hpp +91 -0
  878. data/ext/boost/type_traits/is_base_and_derived.hpp +254 -0
  879. data/ext/boost/type_traits/is_base_of.hpp +51 -0
  880. data/ext/boost/type_traits/is_class.hpp +140 -0
  881. data/ext/boost/type_traits/is_const.hpp +165 -0
  882. data/ext/boost/type_traits/is_convertible.hpp +430 -0
  883. data/ext/boost/type_traits/is_enum.hpp +189 -0
  884. data/ext/boost/type_traits/is_float.hpp +27 -0
  885. data/ext/boost/type_traits/is_function.hpp +106 -0
  886. data/ext/boost/type_traits/is_fundamental.hpp +45 -0
  887. data/ext/boost/type_traits/is_integral.hpp +78 -0
  888. data/ext/boost/type_traits/is_lvalue_reference.hpp +118 -0
  889. data/ext/boost/type_traits/is_member_function_pointer.hpp +136 -0
  890. data/ext/boost/type_traits/is_member_pointer.hpp +116 -0
  891. data/ext/boost/type_traits/is_pod.hpp +135 -0
  892. data/ext/boost/type_traits/is_pointer.hpp +162 -0
  893. data/ext/boost/type_traits/is_reference.hpp +45 -0
  894. data/ext/boost/type_traits/is_rvalue_reference.hpp +29 -0
  895. data/ext/boost/type_traits/is_same.hpp +103 -0
  896. data/ext/boost/type_traits/is_scalar.hpp +55 -0
  897. data/ext/boost/type_traits/is_signed.hpp +135 -0
  898. data/ext/boost/type_traits/is_union.hpp +49 -0
  899. data/ext/boost/type_traits/is_unsigned.hpp +130 -0
  900. data/ext/boost/type_traits/is_void.hpp +38 -0
  901. data/ext/boost/type_traits/is_volatile.hpp +152 -0
  902. data/ext/boost/type_traits/make_unsigned.hpp +137 -0
  903. data/ext/boost/type_traits/remove_const.hpp +90 -0
  904. data/ext/boost/type_traits/remove_cv.hpp +83 -0
  905. data/ext/boost/type_traits/remove_pointer.hpp +43 -0
  906. data/ext/boost/type_traits/remove_reference.hpp +70 -0
  907. data/ext/boost/type_traits/type_with_alignment.hpp +393 -0
  908. data/ext/boost/units/detail/utility.hpp +104 -0
  909. data/ext/boost/utility.hpp +20 -0
  910. data/ext/boost/utility/addressof.hpp +102 -0
  911. data/ext/boost/utility/base_from_member.hpp +87 -0
  912. data/ext/boost/utility/binary.hpp +708 -0
  913. data/ext/boost/utility/compare_pointees.hpp +68 -0
  914. data/ext/boost/utility/enable_if.hpp +119 -0
  915. data/ext/boost/visit_each.hpp +29 -0
  916. data/ext/boost/weak_ptr.hpp +18 -0
  917. data/ext/common/AbstractSpawnManager.h +110 -0
  918. data/ext/common/Account.h +175 -0
  919. data/ext/common/AccountsDatabase.cpp +81 -0
  920. data/ext/common/AccountsDatabase.h +130 -0
  921. data/ext/common/AgentBase.cpp +323 -0
  922. data/ext/common/AgentBase.h +39 -0
  923. data/ext/common/AgentsStarter.cpp +154 -0
  924. data/ext/common/AgentsStarter.h +81 -0
  925. data/ext/common/AgentsStarter.hpp +646 -0
  926. data/ext/common/ApplicationPool/Client.h +796 -0
  927. data/ext/common/ApplicationPool/Interface.h +295 -0
  928. data/ext/common/ApplicationPool/Pool.h +1327 -0
  929. data/ext/common/ApplicationPool/Server.h +475 -0
  930. data/ext/common/BCrypt.cpp +343 -0
  931. data/ext/common/BCrypt.h +73 -0
  932. data/ext/common/Blowfish.c +685 -0
  933. data/ext/common/Blowfish.h +103 -0
  934. data/ext/common/Constants.h +48 -0
  935. data/ext/common/EventedClient.h +702 -0
  936. data/ext/common/EventedMessageServer.h +327 -0
  937. data/ext/common/EventedServer.h +295 -0
  938. data/ext/common/Exceptions.h +348 -0
  939. data/ext/common/FileDescriptor.h +293 -0
  940. data/ext/common/HelperAgent/BacktracesServer.h +59 -0
  941. data/ext/common/IniFile.h +488 -0
  942. data/ext/common/Logging.cpp +64 -0
  943. data/ext/common/Logging.h +695 -0
  944. data/ext/common/LoggingAgent/ChangeNotifier.h +63 -0
  945. data/ext/common/LoggingAgent/DataStoreId.h +177 -0
  946. data/ext/common/LoggingAgent/LoggingServer.h +1343 -0
  947. data/ext/common/LoggingAgent/Main.cpp +278 -0
  948. data/ext/common/LoggingAgent/RemoteSender.h +468 -0
  949. data/ext/common/MessageChannel.h +737 -0
  950. data/ext/common/MessageClient.h +297 -0
  951. data/ext/common/MessageReadersWriters.h +508 -0
  952. data/ext/common/MessageServer.h +581 -0
  953. data/ext/common/PoolOptions.h +518 -0
  954. data/ext/common/Process.h +255 -0
  955. data/ext/common/RandomGenerator.h +160 -0
  956. data/ext/common/ResourceLocator.h +134 -0
  957. data/ext/common/SafeLibev.h +149 -0
  958. data/ext/common/ServerInstanceDir.h +347 -0
  959. data/ext/common/Session.h +470 -0
  960. data/ext/common/SpawnManager.h +616 -0
  961. data/ext/common/StaticString.h +298 -0
  962. data/ext/common/StringListCreator.h +83 -0
  963. data/ext/common/Utils.cpp +972 -0
  964. data/ext/common/Utils.h +428 -0
  965. data/ext/common/Utils/Base64.cpp +143 -0
  966. data/ext/common/Utils/Base64.h +83 -0
  967. data/ext/common/Utils/BlockingQueue.h +136 -0
  968. data/ext/common/Utils/BufferedIO.h +196 -0
  969. data/ext/common/Utils/CachedFileStat.cpp +62 -0
  970. data/ext/common/Utils/CachedFileStat.h +51 -0
  971. data/ext/common/Utils/CachedFileStat.hpp +243 -0
  972. data/ext/common/Utils/FileChangeChecker.h +209 -0
  973. data/ext/common/Utils/IOUtils.cpp +913 -0
  974. data/ext/common/Utils/IOUtils.h +370 -0
  975. data/ext/common/Utils/MD5.cpp +406 -0
  976. data/ext/common/Utils/MD5.h +98 -0
  977. data/ext/common/Utils/MemZeroGuard.h +103 -0
  978. data/ext/common/Utils/ProcessMetricsCollector.h +590 -0
  979. data/ext/common/Utils/ScopeGuard.h +72 -0
  980. data/ext/common/Utils/StrIntUtils.cpp +363 -0
  981. data/ext/common/Utils/StrIntUtils.h +231 -0
  982. data/ext/common/Utils/SystemTime.cpp +37 -0
  983. data/ext/common/Utils/SystemTime.h +201 -0
  984. data/ext/common/Utils/Timer.h +152 -0
  985. data/ext/common/Utils/VariantMap.h +363 -0
  986. data/ext/common/Utils/utf8.h +35 -0
  987. data/ext/common/Utils/utf8/checked.h +324 -0
  988. data/ext/common/Utils/utf8/core.h +359 -0
  989. data/ext/common/Utils/utf8/unchecked.h +229 -0
  990. data/ext/common/Watchdog.cpp +1001 -0
  991. data/ext/google/COPYING +28 -0
  992. data/ext/google/ChangeLog +167 -0
  993. data/ext/google/dense_hash_map +310 -0
  994. data/ext/google/dense_hash_set +287 -0
  995. data/ext/google/sparse_hash_map +294 -0
  996. data/ext/google/sparse_hash_set +275 -0
  997. data/ext/google/sparsehash/densehashtable.h +1062 -0
  998. data/ext/google/sparsehash/sparseconfig.h +55 -0
  999. data/ext/google/sparsehash/sparsehashtable.h +1015 -0
  1000. data/ext/google/sparsetable +1468 -0
  1001. data/ext/google/type_traits.h +250 -0
  1002. data/ext/libev/Changes +302 -0
  1003. data/ext/libev/LICENSE +36 -0
  1004. data/ext/libev/Makefile.am +18 -0
  1005. data/ext/libev/Makefile.in +685 -0
  1006. data/ext/libev/README +58 -0
  1007. data/ext/libev/aclocal.m4 +7549 -0
  1008. data/ext/libev/autogen.sh +6 -0
  1009. data/ext/libev/config.guess +1526 -0
  1010. data/ext/libev/config.h.in +121 -0
  1011. data/ext/libev/config.sub +1658 -0
  1012. data/ext/libev/configure +22156 -0
  1013. data/ext/libev/configure.ac +18 -0
  1014. data/ext/libev/ev++.h +800 -0
  1015. data/ext/libev/ev.c +3694 -0
  1016. data/ext/libev/ev.h +705 -0
  1017. data/ext/libev/ev_epoll.c +228 -0
  1018. data/ext/libev/ev_kqueue.c +196 -0
  1019. data/ext/libev/ev_poll.c +144 -0
  1020. data/ext/libev/ev_port.c +165 -0
  1021. data/ext/libev/ev_select.c +308 -0
  1022. data/ext/libev/ev_vars.h +187 -0
  1023. data/ext/libev/ev_win32.c +153 -0
  1024. data/ext/libev/ev_wrap.h +178 -0
  1025. data/ext/libev/event.c +401 -0
  1026. data/ext/libev/event.h +158 -0
  1027. data/ext/libev/install-sh +294 -0
  1028. data/ext/libev/libev.m4 +38 -0
  1029. data/ext/libev/ltmain.sh +6871 -0
  1030. data/ext/libev/missing +336 -0
  1031. data/ext/libev/mkinstalldirs +111 -0
  1032. data/ext/nginx/Configuration.c +1454 -0
  1033. data/ext/nginx/Configuration.h +94 -0
  1034. data/ext/nginx/ContentHandler.c +1360 -0
  1035. data/ext/nginx/ContentHandler.h +64 -0
  1036. data/ext/nginx/HelperAgent.cpp +988 -0
  1037. data/ext/nginx/HttpStatusExtractor.h +351 -0
  1038. data/ext/nginx/ScgiRequestParser.h +375 -0
  1039. data/ext/nginx/StaticContentHandler.c +256 -0
  1040. data/ext/nginx/StaticContentHandler.h +37 -0
  1041. data/ext/nginx/config +56 -0
  1042. data/ext/nginx/ngx_http_passenger_module.c +499 -0
  1043. data/ext/nginx/ngx_http_passenger_module.h +63 -0
  1044. data/ext/oxt/backtrace.cpp +185 -0
  1045. data/ext/oxt/backtrace.hpp +135 -0
  1046. data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
  1047. data/ext/oxt/detail/backtrace_enabled.hpp +156 -0
  1048. data/ext/oxt/detail/spin_lock_darwin.hpp +69 -0
  1049. data/ext/oxt/detail/spin_lock_gcc_x86.hpp +81 -0
  1050. data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
  1051. data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
  1052. data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
  1053. data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
  1054. data/ext/oxt/dynamic_thread_group.hpp +195 -0
  1055. data/ext/oxt/macros.hpp +58 -0
  1056. data/ext/oxt/spin_lock.hpp +57 -0
  1057. data/ext/oxt/system_calls.cpp +477 -0
  1058. data/ext/oxt/system_calls.hpp +260 -0
  1059. data/ext/oxt/thread.cpp +32 -0
  1060. data/ext/oxt/thread.hpp +370 -0
  1061. data/ext/oxt/tracable_exception.cpp +87 -0
  1062. data/ext/oxt/tracable_exception.hpp +35 -0
  1063. data/ext/ruby/extconf.rb +41 -0
  1064. data/ext/ruby/passenger_native_support.c +1037 -0
  1065. data/helper-scripts/passenger-spawn-server +106 -0
  1066. data/helper-scripts/prespawn +63 -0
  1067. data/lib/phusion_passenger.rb +107 -0
  1068. data/lib/phusion_passenger/abstract_installer.rb +234 -0
  1069. data/lib/phusion_passenger/abstract_request_handler.rb +738 -0
  1070. data/lib/phusion_passenger/abstract_server.rb +372 -0
  1071. data/lib/phusion_passenger/abstract_server_collection.rb +335 -0
  1072. data/lib/phusion_passenger/admin_tools.rb +48 -0
  1073. data/lib/phusion_passenger/admin_tools/memory_stats.rb +299 -0
  1074. data/lib/phusion_passenger/admin_tools/server_instance.rb +334 -0
  1075. data/lib/phusion_passenger/analytics_logger.rb +342 -0
  1076. data/lib/phusion_passenger/app_process.rb +162 -0
  1077. data/lib/phusion_passenger/classic_rails/application_spawner.rb +344 -0
  1078. data/lib/phusion_passenger/classic_rails/cgi_fixed.rb +68 -0
  1079. data/lib/phusion_passenger/classic_rails/framework_spawner.rb +311 -0
  1080. data/lib/phusion_passenger/classic_rails/request_handler.rb +75 -0
  1081. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_base_extension.rb +65 -0
  1082. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_benchmarking_extension.rb +48 -0
  1083. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ac_rescue_extension.rb +59 -0
  1084. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/ar_abstract_adapter_extension.rb +54 -0
  1085. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/as_cache_extension.rb +130 -0
  1086. data/lib/phusion_passenger/classic_rails_extensions/analytics_logging/av_benchmark_helper_extension.rb +47 -0
  1087. data/lib/phusion_passenger/classic_rails_extensions/init.rb +123 -0
  1088. data/lib/phusion_passenger/console_text_template.rb +66 -0
  1089. data/lib/phusion_passenger/constants.rb +35 -0
  1090. data/lib/phusion_passenger/debug_logging.rb +104 -0
  1091. data/lib/phusion_passenger/dependencies.rb +633 -0
  1092. data/lib/phusion_passenger/exceptions.rb +103 -0
  1093. data/lib/phusion_passenger/html_template.rb +107 -0
  1094. data/lib/phusion_passenger/message_channel.rb +387 -0
  1095. data/lib/phusion_passenger/message_client.rb +173 -0
  1096. data/lib/phusion_passenger/native_support.rb +166 -0
  1097. data/lib/phusion_passenger/packaging.rb +108 -0
  1098. data/lib/phusion_passenger/platform_info.rb +248 -0
  1099. data/lib/phusion_passenger/platform_info/apache.rb +332 -0
  1100. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +175 -0
  1101. data/lib/phusion_passenger/platform_info/compiler.rb +183 -0
  1102. data/lib/phusion_passenger/platform_info/curl.rb +61 -0
  1103. data/lib/phusion_passenger/platform_info/documentation_tools.rb +35 -0
  1104. data/lib/phusion_passenger/platform_info/linux.rb +77 -0
  1105. data/lib/phusion_passenger/platform_info/operating_system.rb +158 -0
  1106. data/lib/phusion_passenger/platform_info/ruby.rb +338 -0
  1107. data/lib/phusion_passenger/platform_info/zlib.rb +38 -0
  1108. data/lib/phusion_passenger/plugin.rb +96 -0
  1109. data/lib/phusion_passenger/public_api.rb +112 -0
  1110. data/lib/phusion_passenger/rack/application_spawner.rb +227 -0
  1111. data/lib/phusion_passenger/rack/request_handler.rb +145 -0
  1112. data/lib/phusion_passenger/rails3_extensions/init.rb +207 -0
  1113. data/lib/phusion_passenger/simple_benchmarking.rb +52 -0
  1114. data/lib/phusion_passenger/spawn_manager.rb +359 -0
  1115. data/lib/phusion_passenger/standalone/app_finder.rb +153 -0
  1116. data/lib/phusion_passenger/standalone/command.rb +241 -0
  1117. data/lib/phusion_passenger/standalone/config_file.rb +119 -0
  1118. data/lib/phusion_passenger/standalone/help_command.rb +57 -0
  1119. data/lib/phusion_passenger/standalone/main.rb +101 -0
  1120. data/lib/phusion_passenger/standalone/package_runtime_command.rb +92 -0
  1121. data/lib/phusion_passenger/standalone/runtime_installer.rb +479 -0
  1122. data/lib/phusion_passenger/standalone/start_command.rb +514 -0
  1123. data/lib/phusion_passenger/standalone/status_command.rb +62 -0
  1124. data/lib/phusion_passenger/standalone/stop_command.rb +74 -0
  1125. data/lib/phusion_passenger/standalone/utils.rb +46 -0
  1126. data/lib/phusion_passenger/standalone/version_command.rb +42 -0
  1127. data/lib/phusion_passenger/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +9 -0
  1128. data/lib/phusion_passenger/templates/apache2/config_snippets.txt.erb +13 -0
  1129. data/lib/phusion_passenger/templates/apache2/deployment_example.txt.erb +23 -0
  1130. data/lib/phusion_passenger/templates/apache2/no_write_permission_to_passenger_root.txt.erb +9 -0
  1131. data/lib/phusion_passenger/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  1132. data/lib/phusion_passenger/templates/apache2/run_installer_as_root.txt.erb +8 -0
  1133. data/lib/phusion_passenger/templates/apache2/welcome.txt.erb +15 -0
  1134. data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
  1135. data/lib/phusion_passenger/templates/app_init_error.html.erb +64 -0
  1136. data/lib/phusion_passenger/templates/database_error.html.erb +66 -0
  1137. data/lib/phusion_passenger/templates/error_layout.css +97 -0
  1138. data/lib/phusion_passenger/templates/error_layout.html.erb +39 -0
  1139. data/lib/phusion_passenger/templates/framework_init_error.html.erb +39 -0
  1140. data/lib/phusion_passenger/templates/general_error.html.erb +22 -0
  1141. data/lib/phusion_passenger/templates/load_error.html.erb +46 -0
  1142. data/lib/phusion_passenger/templates/nginx/ask_for_extra_configure_flags.txt.erb +8 -0
  1143. data/lib/phusion_passenger/templates/nginx/cannot_write_to_dir.txt.erb +11 -0
  1144. data/lib/phusion_passenger/templates/nginx/config_snippets.txt.erb +17 -0
  1145. data/lib/phusion_passenger/templates/nginx/config_snippets_inserted.txt.erb +20 -0
  1146. data/lib/phusion_passenger/templates/nginx/confirm_extra_configure_flags.txt.erb +5 -0
  1147. data/lib/phusion_passenger/templates/nginx/deployment_example.txt.erb +22 -0
  1148. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_downloaded.txt.erb +11 -0
  1149. data/lib/phusion_passenger/templates/nginx/pcre_could_not_be_extracted.txt.erb +11 -0
  1150. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +11 -0
  1151. data/lib/phusion_passenger/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +20 -0
  1152. data/lib/phusion_passenger/templates/nginx/query_download_and_install.txt.erb +21 -0
  1153. data/lib/phusion_passenger/templates/nginx/run_installer_as_root.txt.erb +8 -0
  1154. data/lib/phusion_passenger/templates/nginx/welcome.txt.erb +15 -0
  1155. data/lib/phusion_passenger/templates/standalone/cannot_write_to_dir.txt.erb +11 -0
  1156. data/lib/phusion_passenger/templates/standalone/config.erb +94 -0
  1157. data/lib/phusion_passenger/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +17 -0
  1158. data/lib/phusion_passenger/templates/standalone/run_installer_as_root.txt.erb +8 -0
  1159. data/lib/phusion_passenger/templates/standalone/welcome.txt.erb +8 -0
  1160. data/lib/phusion_passenger/templates/standalone_default_root/index.html +1 -0
  1161. data/lib/phusion_passenger/templates/version_not_found.html.erb +34 -0
  1162. data/lib/phusion_passenger/utils.rb +1080 -0
  1163. data/lib/phusion_passenger/utils/file_system_watcher.rb +186 -0
  1164. data/lib/phusion_passenger/utils/hosts_file_parser.rb +130 -0
  1165. data/lib/phusion_passenger/utils/rewindable_input.rb +125 -0
  1166. data/lib/phusion_passenger/utils/tmpdir.rb +70 -0
  1167. data/lib/phusion_passenger/utils/unseekable_socket.rb +196 -0
  1168. data/lib/phusion_passenger/wsgi/application_spawner.rb +108 -0
  1169. data/lib/phusion_passenger/wsgi/request_handler.py +199 -0
  1170. data/man/passenger-config.1 +29 -0
  1171. data/man/passenger-make-enterprisey.8 +23 -0
  1172. data/man/passenger-memory-stats.8 +33 -0
  1173. data/man/passenger-status.8 +43 -0
  1174. data/man/passenger-stress-test.1 +43 -0
  1175. data/resources/mime.types +73 -0
  1176. data/resources/union_station_gateway.crt +32 -0
  1177. data/test/config.yml.example +41 -0
  1178. data/test/cxx/ApplicationPool_PoolTest.cpp +33 -0
  1179. data/test/cxx/ApplicationPool_PoolTestCases.cpp +1029 -0
  1180. data/test/cxx/ApplicationPool_ServerTest.cpp +308 -0
  1181. data/test/cxx/ApplicationPool_Server_PoolTest.cpp +80 -0
  1182. data/test/cxx/Base64Test.cpp +50 -0
  1183. data/test/cxx/BufferedIOTest.cpp +364 -0
  1184. data/test/cxx/CachedFileStatTest.cpp +402 -0
  1185. data/test/cxx/CxxTestMain.cpp +122 -0
  1186. data/test/cxx/EventedClientTest.cpp +523 -0
  1187. data/test/cxx/FileChangeCheckerTest.cpp +329 -0
  1188. data/test/cxx/FileDescriptorTest.cpp +69 -0
  1189. data/test/cxx/HttpStatusExtractorTest.cpp +198 -0
  1190. data/test/cxx/IOUtilsTest.cpp +796 -0
  1191. data/test/cxx/LoggingTest.cpp +914 -0
  1192. data/test/cxx/MessageChannelTest.cpp +557 -0
  1193. data/test/cxx/MessageReadersWritersTest.cpp +574 -0
  1194. data/test/cxx/MessageServerTest.cpp +383 -0
  1195. data/test/cxx/PoolOptionsTest.cpp +116 -0
  1196. data/test/cxx/ProcessMetricsCollectorTest.cpp +121 -0
  1197. data/test/cxx/ScgiRequestParserTest.cpp +389 -0
  1198. data/test/cxx/ServerInstanceDirTest.cpp +186 -0
  1199. data/test/cxx/SpawnManagerTest.cpp +161 -0
  1200. data/test/cxx/StaticStringTest.cpp +220 -0
  1201. data/test/cxx/SystemTimeTest.cpp +37 -0
  1202. data/test/cxx/TestSupport.cpp +166 -0
  1203. data/test/cxx/TestSupport.h +254 -0
  1204. data/test/cxx/UtilsTest.cpp +491 -0
  1205. data/test/cxx/VariantMapTest.cpp +179 -0
  1206. data/test/integration_tests/apache2_tests.rb +666 -0
  1207. data/test/integration_tests/cgi_environment_spec.rb +26 -0
  1208. data/test/integration_tests/hello_world_rack_spec.rb +36 -0
  1209. data/test/integration_tests/hello_world_wsgi_spec.rb +41 -0
  1210. data/test/integration_tests/mycook_spec.rb +166 -0
  1211. data/test/integration_tests/nginx_tests.rb +260 -0
  1212. data/test/integration_tests/spec_helper.rb +19 -0
  1213. data/test/oxt/backtrace_test.cpp +88 -0
  1214. data/test/oxt/counter.hpp +55 -0
  1215. data/test/oxt/dynamic_thread_group_test.cpp +131 -0
  1216. data/test/oxt/oxt_test_main.cpp +25 -0
  1217. data/test/oxt/spin_lock_test.cpp +59 -0
  1218. data/test/oxt/syscall_interruption_test.cpp +38 -0
  1219. data/test/ruby/abstract_request_handler_spec.rb +406 -0
  1220. data/test/ruby/abstract_server_collection_spec.rb +247 -0
  1221. data/test/ruby/abstract_server_spec.rb +61 -0
  1222. data/test/ruby/admin_tools_spec.rb +362 -0
  1223. data/test/ruby/analytics_logger_spec.rb +253 -0
  1224. data/test/ruby/app_process_spec.rb +43 -0
  1225. data/test/ruby/classic_rails/application_spawner_spec.rb +89 -0
  1226. data/test/ruby/classic_rails/framework_spawner_spec.rb +92 -0
  1227. data/test/ruby/debug_logging_spec.rb +141 -0
  1228. data/test/ruby/message_channel_spec.rb +196 -0
  1229. data/test/ruby/rack/application_spawner_spec.rb +116 -0
  1230. data/test/ruby/shared/abstract_server_spec.rb +23 -0
  1231. data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +375 -0
  1232. data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +38 -0
  1233. data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +19 -0
  1234. data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +15 -0
  1235. data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +27 -0
  1236. data/test/ruby/shared/spawners/preloading_spawner_spec.rb +29 -0
  1237. data/test/ruby/shared/spawners/reload_all_spec.rb +36 -0
  1238. data/test/ruby/shared/spawners/reload_single_spec.rb +52 -0
  1239. data/test/ruby/shared/spawners/spawn_server_spec.rb +28 -0
  1240. data/test/ruby/shared/spawners/spawner_spec.rb +273 -0
  1241. data/test/ruby/shared/utils/pseudo_io_spec.rb +60 -0
  1242. data/test/ruby/spawn_manager_spec.rb +134 -0
  1243. data/test/ruby/spec_helper.rb +104 -0
  1244. data/test/ruby/utils/file_system_watcher_spec.rb +221 -0
  1245. data/test/ruby/utils/hosts_file_parser.rb +258 -0
  1246. data/test/ruby/utils/unseekable_socket_spec.rb +66 -0
  1247. data/test/ruby/utils_spec.rb +748 -0
  1248. data/test/ruby/wsgi/application_spawner_spec.rb +50 -0
  1249. data/test/stub/apache2/httpd.conf.erb +86 -0
  1250. data/test/stub/apache2/mime.types +748 -0
  1251. data/test/stub/garbage1.dat +0 -0
  1252. data/test/stub/garbage2.dat +0 -0
  1253. data/test/stub/garbage3.dat +0 -0
  1254. data/test/stub/http_request.yml +23 -0
  1255. data/test/stub/message_channel.rb +11 -0
  1256. data/test/stub/message_channel_2.rb +12 -0
  1257. data/test/stub/message_channel_3.rb +19 -0
  1258. data/test/stub/nginx/koi-utf +109 -0
  1259. data/test/stub/nginx/koi-win +103 -0
  1260. data/test/stub/nginx/mime.types +70 -0
  1261. data/test/stub/nginx/nginx.conf.erb +58 -0
  1262. data/test/stub/nginx/win-utf +126 -0
  1263. data/test/stub/rack/config.ru +4 -0
  1264. data/test/stub/rack/public/rack.jpg +0 -0
  1265. data/test/stub/rails_apps/1.2/empty/Rakefile +10 -0
  1266. data/test/stub/rails_apps/1.2/empty/app/controllers/application.rb +7 -0
  1267. data/test/stub/rails_apps/1.2/empty/app/helpers/application_helper.rb +3 -0
  1268. data/test/stub/rails_apps/1.2/empty/config/boot.rb +108 -0
  1269. data/test/stub/rails_apps/1.2/empty/config/database.yml +31 -0
  1270. data/test/stub/rails_apps/1.2/empty/config/environment.rb +66 -0
  1271. data/test/stub/rails_apps/1.2/empty/config/environments/development.rb +21 -0
  1272. data/test/stub/rails_apps/1.2/empty/config/environments/production.rb +18 -0
  1273. data/test/stub/rails_apps/1.2/empty/config/environments/staging.rb +18 -0
  1274. data/test/stub/rails_apps/1.2/empty/config/environments/test.rb +19 -0
  1275. data/test/stub/rails_apps/1.2/empty/config/routes.rb +23 -0
  1276. data/test/stub/rails_apps/1.2/empty/doc/README_FOR_APP +2 -0
  1277. data/test/stub/rails_apps/1.2/empty/public/404.html +30 -0
  1278. data/test/stub/rails_apps/1.2/empty/public/500.html +30 -0
  1279. data/test/stub/rails_apps/1.2/empty/public/dispatch.cgi +10 -0
  1280. data/test/stub/rails_apps/1.2/empty/public/dispatch.fcgi +24 -0
  1281. data/test/stub/rails_apps/1.2/empty/public/dispatch.rb +10 -0
  1282. data/test/stub/rails_apps/1.2/empty/public/favicon.ico +0 -0
  1283. data/test/stub/rails_apps/1.2/empty/public/images/rails.png +0 -0
  1284. data/test/stub/rails_apps/1.2/empty/public/robots.txt +1 -0
  1285. data/test/stub/rails_apps/1.2/empty/script/about +3 -0
  1286. data/test/stub/rails_apps/1.2/empty/script/breakpointer +3 -0
  1287. data/test/stub/rails_apps/1.2/empty/script/console +3 -0
  1288. data/test/stub/rails_apps/1.2/empty/script/destroy +3 -0
  1289. data/test/stub/rails_apps/1.2/empty/script/generate +3 -0
  1290. data/test/stub/rails_apps/1.2/empty/script/performance/benchmarker +3 -0
  1291. data/test/stub/rails_apps/1.2/empty/script/performance/profiler +3 -0
  1292. data/test/stub/rails_apps/1.2/empty/script/plugin +3 -0
  1293. data/test/stub/rails_apps/1.2/empty/script/process/inspector +3 -0
  1294. data/test/stub/rails_apps/1.2/empty/script/process/reaper +3 -0
  1295. data/test/stub/rails_apps/1.2/empty/script/process/spawner +3 -0
  1296. data/test/stub/rails_apps/1.2/empty/script/runner +3 -0
  1297. data/test/stub/rails_apps/1.2/empty/script/server +3 -0
  1298. data/test/stub/rails_apps/1.2/empty/test/test_helper.rb +28 -0
  1299. data/test/stub/rails_apps/2.0/empty/Rakefile +10 -0
  1300. data/test/stub/rails_apps/2.0/empty/app/controllers/application.rb +10 -0
  1301. data/test/stub/rails_apps/2.0/empty/app/helpers/application_helper.rb +3 -0
  1302. data/test/stub/rails_apps/2.0/empty/config/boot.rb +108 -0
  1303. data/test/stub/rails_apps/2.0/empty/config/database.yml +31 -0
  1304. data/test/stub/rails_apps/2.0/empty/config/environment.rb +59 -0
  1305. data/test/stub/rails_apps/2.0/empty/config/environments/development.rb +18 -0
  1306. data/test/stub/rails_apps/2.0/empty/config/environments/production.rb +18 -0
  1307. data/test/stub/rails_apps/2.0/empty/config/environments/staging.rb +18 -0
  1308. data/test/stub/rails_apps/2.0/empty/config/environments/test.rb +22 -0
  1309. data/test/stub/rails_apps/2.0/empty/config/initializers/inflections.rb +10 -0
  1310. data/test/stub/rails_apps/2.0/empty/config/initializers/mime_types.rb +5 -0
  1311. data/test/stub/rails_apps/2.0/empty/config/routes.rb +35 -0
  1312. data/test/stub/rails_apps/2.0/empty/doc/README_FOR_APP +2 -0
  1313. data/test/stub/rails_apps/2.0/empty/public/404.html +30 -0
  1314. data/test/stub/rails_apps/2.0/empty/public/422.html +30 -0
  1315. data/test/stub/rails_apps/2.0/empty/public/500.html +30 -0
  1316. data/test/stub/rails_apps/2.0/empty/public/dispatch.cgi +10 -0
  1317. data/test/stub/rails_apps/2.0/empty/public/dispatch.fcgi +24 -0
  1318. data/test/stub/rails_apps/2.0/empty/public/dispatch.rb +10 -0
  1319. data/test/stub/rails_apps/2.0/empty/public/favicon.ico +0 -0
  1320. data/test/stub/rails_apps/2.0/empty/public/images/rails.png +0 -0
  1321. data/test/stub/rails_apps/2.0/empty/public/robots.txt +5 -0
  1322. data/test/stub/rails_apps/2.0/empty/script/about +3 -0
  1323. data/test/stub/rails_apps/2.0/empty/script/console +3 -0
  1324. data/test/stub/rails_apps/2.0/empty/script/destroy +3 -0
  1325. data/test/stub/rails_apps/2.0/empty/script/generate +3 -0
  1326. data/test/stub/rails_apps/2.0/empty/script/performance/benchmarker +3 -0
  1327. data/test/stub/rails_apps/2.0/empty/script/performance/profiler +3 -0
  1328. data/test/stub/rails_apps/2.0/empty/script/performance/request +3 -0
  1329. data/test/stub/rails_apps/2.0/empty/script/plugin +3 -0
  1330. data/test/stub/rails_apps/2.0/empty/script/process/inspector +3 -0
  1331. data/test/stub/rails_apps/2.0/empty/script/process/reaper +3 -0
  1332. data/test/stub/rails_apps/2.0/empty/script/process/spawner +3 -0
  1333. data/test/stub/rails_apps/2.0/empty/script/runner +3 -0
  1334. data/test/stub/rails_apps/2.0/empty/script/server +3 -0
  1335. data/test/stub/rails_apps/2.0/empty/test/test_helper.rb +38 -0
  1336. data/test/stub/rails_apps/2.2/empty/Rakefile +10 -0
  1337. data/test/stub/rails_apps/2.2/empty/app/controllers/application.rb +15 -0
  1338. data/test/stub/rails_apps/2.2/empty/app/helpers/application_helper.rb +3 -0
  1339. data/test/stub/rails_apps/2.2/empty/config/boot.rb +109 -0
  1340. data/test/stub/rails_apps/2.2/empty/config/database.yml +31 -0
  1341. data/test/stub/rails_apps/2.2/empty/config/environment.rb +75 -0
  1342. data/test/stub/rails_apps/2.2/empty/config/environments/development.rb +17 -0
  1343. data/test/stub/rails_apps/2.2/empty/config/environments/production.rb +24 -0
  1344. data/test/stub/rails_apps/2.2/empty/config/environments/staging.rb +24 -0
  1345. data/test/stub/rails_apps/2.2/empty/config/environments/test.rb +22 -0
  1346. data/test/stub/rails_apps/2.2/empty/config/initializers/inflections.rb +10 -0
  1347. data/test/stub/rails_apps/2.2/empty/config/initializers/mime_types.rb +5 -0
  1348. data/test/stub/rails_apps/2.2/empty/config/initializers/new_rails_defaults.rb +17 -0
  1349. data/test/stub/rails_apps/2.2/empty/config/locales/en.yml +5 -0
  1350. data/test/stub/rails_apps/2.2/empty/config/routes.rb +43 -0
  1351. data/test/stub/rails_apps/2.2/empty/doc/README_FOR_APP +5 -0
  1352. data/test/stub/rails_apps/2.2/empty/public/404.html +30 -0
  1353. data/test/stub/rails_apps/2.2/empty/public/422.html +30 -0
  1354. data/test/stub/rails_apps/2.2/empty/public/500.html +33 -0
  1355. data/test/stub/rails_apps/2.2/empty/public/dispatch.cgi +10 -0
  1356. data/test/stub/rails_apps/2.2/empty/public/dispatch.fcgi +24 -0
  1357. data/test/stub/rails_apps/2.2/empty/public/dispatch.rb +10 -0
  1358. data/test/stub/rails_apps/2.2/empty/public/favicon.ico +0 -0
  1359. data/test/stub/rails_apps/2.2/empty/public/images/rails.png +0 -0
  1360. data/test/stub/rails_apps/2.2/empty/public/robots.txt +5 -0
  1361. data/test/stub/rails_apps/2.2/empty/script/about +4 -0
  1362. data/test/stub/rails_apps/2.2/empty/script/console +3 -0
  1363. data/test/stub/rails_apps/2.2/empty/script/dbconsole +3 -0
  1364. data/test/stub/rails_apps/2.2/empty/script/destroy +3 -0
  1365. data/test/stub/rails_apps/2.2/empty/script/generate +3 -0
  1366. data/test/stub/rails_apps/2.2/empty/script/performance/benchmarker +3 -0
  1367. data/test/stub/rails_apps/2.2/empty/script/performance/profiler +3 -0
  1368. data/test/stub/rails_apps/2.2/empty/script/performance/request +3 -0
  1369. data/test/stub/rails_apps/2.2/empty/script/plugin +3 -0
  1370. data/test/stub/rails_apps/2.2/empty/script/process/inspector +3 -0
  1371. data/test/stub/rails_apps/2.2/empty/script/process/reaper +3 -0
  1372. data/test/stub/rails_apps/2.2/empty/script/process/spawner +3 -0
  1373. data/test/stub/rails_apps/2.2/empty/script/runner +3 -0
  1374. data/test/stub/rails_apps/2.2/empty/script/server +3 -0
  1375. data/test/stub/rails_apps/2.2/empty/test/performance/browsing_test.rb +9 -0
  1376. data/test/stub/rails_apps/2.2/empty/test/test_helper.rb +38 -0
  1377. data/test/stub/rails_apps/2.3/empty/Rakefile +10 -0
  1378. data/test/stub/rails_apps/2.3/empty/app/controllers/application_controller.rb +10 -0
  1379. data/test/stub/rails_apps/2.3/empty/app/helpers/application_helper.rb +3 -0
  1380. data/test/stub/rails_apps/2.3/empty/config/boot.rb +110 -0
  1381. data/test/stub/rails_apps/2.3/empty/config/database.yml +31 -0
  1382. data/test/stub/rails_apps/2.3/empty/config/environment.rb +41 -0
  1383. data/test/stub/rails_apps/2.3/empty/config/environments/development.rb +17 -0
  1384. data/test/stub/rails_apps/2.3/empty/config/environments/production.rb +28 -0
  1385. data/test/stub/rails_apps/2.3/empty/config/environments/staging.rb +28 -0
  1386. data/test/stub/rails_apps/2.3/empty/config/environments/test.rb +28 -0
  1387. data/test/stub/rails_apps/2.3/empty/config/initializers/backtrace_silencers.rb +7 -0
  1388. data/test/stub/rails_apps/2.3/empty/config/initializers/inflections.rb +10 -0
  1389. data/test/stub/rails_apps/2.3/empty/config/initializers/mime_types.rb +5 -0
  1390. data/test/stub/rails_apps/2.3/empty/config/initializers/new_rails_defaults.rb +21 -0
  1391. data/test/stub/rails_apps/2.3/empty/config/initializers/session_store.rb +15 -0
  1392. data/test/stub/rails_apps/2.3/empty/config/locales/en.yml +5 -0
  1393. data/test/stub/rails_apps/2.3/empty/config/routes.rb +43 -0
  1394. data/test/stub/rails_apps/2.3/empty/db/seeds.rb +7 -0
  1395. data/test/stub/rails_apps/2.3/empty/doc/README_FOR_APP +2 -0
  1396. data/test/stub/rails_apps/2.3/empty/public/404.html +30 -0
  1397. data/test/stub/rails_apps/2.3/empty/public/422.html +30 -0
  1398. data/test/stub/rails_apps/2.3/empty/public/500.html +30 -0
  1399. data/test/stub/rails_apps/2.3/empty/public/favicon.ico +0 -0
  1400. data/test/stub/rails_apps/2.3/empty/public/images/rails.png +0 -0
  1401. data/test/stub/rails_apps/2.3/empty/public/robots.txt +5 -0
  1402. data/test/stub/rails_apps/2.3/empty/script/about +4 -0
  1403. data/test/stub/rails_apps/2.3/empty/script/console +3 -0
  1404. data/test/stub/rails_apps/2.3/empty/script/dbconsole +3 -0
  1405. data/test/stub/rails_apps/2.3/empty/script/destroy +3 -0
  1406. data/test/stub/rails_apps/2.3/empty/script/generate +3 -0
  1407. data/test/stub/rails_apps/2.3/empty/script/performance/benchmarker +3 -0
  1408. data/test/stub/rails_apps/2.3/empty/script/performance/profiler +3 -0
  1409. data/test/stub/rails_apps/2.3/empty/script/plugin +3 -0
  1410. data/test/stub/rails_apps/2.3/empty/script/runner +3 -0
  1411. data/test/stub/rails_apps/2.3/empty/script/server +3 -0
  1412. data/test/stub/rails_apps/2.3/empty/test/performance/browsing_test.rb +9 -0
  1413. data/test/stub/rails_apps/2.3/empty/test/test_helper.rb +38 -0
  1414. data/test/stub/rails_apps/2.3/foobar/Rakefile +10 -0
  1415. data/test/stub/rails_apps/2.3/foobar/app/controllers/application_controller.rb +12 -0
  1416. data/test/stub/rails_apps/2.3/foobar/app/controllers/bar_controller_1.rb +5 -0
  1417. data/test/stub/rails_apps/2.3/foobar/app/controllers/bar_controller_2.rb +5 -0
  1418. data/test/stub/rails_apps/2.3/foobar/app/controllers/foo_controller.rb +21 -0
  1419. data/test/stub/rails_apps/2.3/foobar/app/helpers/application_helper.rb +3 -0
  1420. data/test/stub/rails_apps/2.3/foobar/config/boot.rb +110 -0
  1421. data/test/stub/rails_apps/2.3/foobar/config/database.yml +19 -0
  1422. data/test/stub/rails_apps/2.3/foobar/config/environment.rb +59 -0
  1423. data/test/stub/rails_apps/2.3/foobar/config/environments/development.rb +17 -0
  1424. data/test/stub/rails_apps/2.3/foobar/config/environments/production.rb +18 -0
  1425. data/test/stub/rails_apps/2.3/foobar/config/environments/staging.rb +18 -0
  1426. data/test/stub/rails_apps/2.3/foobar/config/initializers/inflections.rb +10 -0
  1427. data/test/stub/rails_apps/2.3/foobar/config/initializers/mime_types.rb +5 -0
  1428. data/test/stub/rails_apps/2.3/foobar/config/routes.rb +35 -0
  1429. data/test/stub/rails_apps/2.3/foobar/script/about +3 -0
  1430. data/test/stub/rails_apps/2.3/foobar/script/console +3 -0
  1431. data/test/stub/rails_apps/2.3/foobar/script/dbconsole +3 -0
  1432. data/test/stub/rails_apps/2.3/foobar/script/destroy +3 -0
  1433. data/test/stub/rails_apps/2.3/foobar/script/generate +3 -0
  1434. data/test/stub/rails_apps/2.3/foobar/script/performance/benchmarker +3 -0
  1435. data/test/stub/rails_apps/2.3/foobar/script/performance/profiler +3 -0
  1436. data/test/stub/rails_apps/2.3/foobar/script/performance/request +3 -0
  1437. data/test/stub/rails_apps/2.3/foobar/script/plugin +3 -0
  1438. data/test/stub/rails_apps/2.3/foobar/script/process/inspector +3 -0
  1439. data/test/stub/rails_apps/2.3/foobar/script/process/reaper +3 -0
  1440. data/test/stub/rails_apps/2.3/foobar/script/process/spawner +3 -0
  1441. data/test/stub/rails_apps/2.3/foobar/script/runner +3 -0
  1442. data/test/stub/rails_apps/2.3/foobar/script/server +3 -0
  1443. data/test/stub/rails_apps/2.3/mycook/Rakefile +10 -0
  1444. data/test/stub/rails_apps/2.3/mycook/app/controllers/application_controller.rb +12 -0
  1445. data/test/stub/rails_apps/2.3/mycook/app/controllers/recipes_controller.rb +5 -0
  1446. data/test/stub/rails_apps/2.3/mycook/app/controllers/uploads_controller.rb +15 -0
  1447. data/test/stub/rails_apps/2.3/mycook/app/controllers/welcome_controller.rb +71 -0
  1448. data/test/stub/rails_apps/2.3/mycook/app/helpers/application_helper.rb +3 -0
  1449. data/test/stub/rails_apps/2.3/mycook/app/views/layouts/default.rhtml +26 -0
  1450. data/test/stub/rails_apps/2.3/mycook/app/views/recipes/create.rhtml +13 -0
  1451. data/test/stub/rails_apps/2.3/mycook/app/views/recipes/index.rhtml +3 -0
  1452. data/test/stub/rails_apps/2.3/mycook/app/views/recipes/new.rhtml +8 -0
  1453. data/test/stub/rails_apps/2.3/mycook/app/views/uploads/index.rhtml +1 -0
  1454. data/test/stub/rails_apps/2.3/mycook/app/views/uploads/new.html.erb +8 -0
  1455. data/test/stub/rails_apps/2.3/mycook/app/views/welcome/cached.rhtml +1 -0
  1456. data/test/stub/rails_apps/2.3/mycook/app/views/welcome/index.rhtml +20 -0
  1457. data/test/stub/rails_apps/2.3/mycook/config/boot.rb +110 -0
  1458. data/test/stub/rails_apps/2.3/mycook/config/database.yml +19 -0
  1459. data/test/stub/rails_apps/2.3/mycook/config/environment.rb +61 -0
  1460. data/test/stub/rails_apps/2.3/mycook/config/environments/development.rb +18 -0
  1461. data/test/stub/rails_apps/2.3/mycook/config/environments/production.rb +19 -0
  1462. data/test/stub/rails_apps/2.3/mycook/config/initializers/inflections.rb +10 -0
  1463. data/test/stub/rails_apps/2.3/mycook/config/initializers/mime_types.rb +5 -0
  1464. data/test/stub/rails_apps/2.3/mycook/config/routes.rb +38 -0
  1465. data/test/stub/rails_apps/2.3/mycook/log/useless.txt +1 -0
  1466. data/test/stub/rails_apps/2.3/mycook/public/404.html +30 -0
  1467. data/test/stub/rails_apps/2.3/mycook/public/422.html +30 -0
  1468. data/test/stub/rails_apps/2.3/mycook/public/500.html +30 -0
  1469. data/test/stub/rails_apps/2.3/mycook/public/dispatch.cgi +10 -0
  1470. data/test/stub/rails_apps/2.3/mycook/public/dispatch.fcgi +24 -0
  1471. data/test/stub/rails_apps/2.3/mycook/public/dispatch.rb +10 -0
  1472. data/test/stub/rails_apps/2.3/mycook/public/favicon.ico +0 -0
  1473. data/test/stub/rails_apps/2.3/mycook/public/images/angrywizard.gif +0 -0
  1474. data/test/stub/rails_apps/2.3/mycook/public/images/cookbook.gif +0 -0
  1475. data/test/stub/rails_apps/2.3/mycook/public/images/header.png +0 -0
  1476. data/test/stub/rails_apps/2.3/mycook/public/images/rails.png +0 -0
  1477. data/test/stub/rails_apps/2.3/mycook/public/javascripts/application.js +2 -0
  1478. data/test/stub/rails_apps/2.3/mycook/public/javascripts/controls.js +963 -0
  1479. data/test/stub/rails_apps/2.3/mycook/public/javascripts/dragdrop.js +973 -0
  1480. data/test/stub/rails_apps/2.3/mycook/public/javascripts/effects.js +1128 -0
  1481. data/test/stub/rails_apps/2.3/mycook/public/javascripts/prototype.js +4320 -0
  1482. data/test/stub/rails_apps/2.3/mycook/public/robots.txt +5 -0
  1483. data/test/stub/rails_apps/2.3/mycook/public/uploads.html +26 -0
  1484. data/test/stub/rails_apps/2.3/mycook/public/welcome/cached.html +26 -0
  1485. data/test/stub/rails_apps/2.3/mycook/script/about +3 -0
  1486. data/test/stub/rails_apps/2.3/mycook/script/console +3 -0
  1487. data/test/stub/rails_apps/2.3/mycook/script/dbconsole +3 -0
  1488. data/test/stub/rails_apps/2.3/mycook/script/destroy +3 -0
  1489. data/test/stub/rails_apps/2.3/mycook/script/generate +3 -0
  1490. data/test/stub/rails_apps/2.3/mycook/script/performance/benchmarker +3 -0
  1491. data/test/stub/rails_apps/2.3/mycook/script/performance/profiler +3 -0
  1492. data/test/stub/rails_apps/2.3/mycook/script/performance/request +3 -0
  1493. data/test/stub/rails_apps/2.3/mycook/script/plugin +3 -0
  1494. data/test/stub/rails_apps/2.3/mycook/script/process/inspector +3 -0
  1495. data/test/stub/rails_apps/2.3/mycook/script/process/reaper +3 -0
  1496. data/test/stub/rails_apps/2.3/mycook/script/process/spawner +3 -0
  1497. data/test/stub/rails_apps/2.3/mycook/script/runner +3 -0
  1498. data/test/stub/rails_apps/2.3/mycook/script/server +3 -0
  1499. data/test/stub/rails_apps/2.3/mycook/sites/some.site/public/uploads.html +26 -0
  1500. data/test/stub/rails_apps/2.3/mycook/sites/some.site/public/welcome/cached.html +26 -0
  1501. data/test/stub/rails_apps/2.3/mycook/tmp/cache/useless.txt +1 -0
  1502. data/test/stub/rails_apps/2.3/mycook/tmp/pids/useless.txt +1 -0
  1503. data/test/stub/rails_apps/2.3/mycook/tmp/sessions/useless.txt +1 -0
  1504. data/test/stub/rails_apps/2.3/mycook/tmp/sockets/useless.txt +1 -0
  1505. data/test/stub/rails_apps/3.0/empty/Gemfile +22 -0
  1506. data/test/stub/rails_apps/3.0/empty/Gemfile.lock +73 -0
  1507. data/test/stub/rails_apps/3.0/empty/Rakefile +10 -0
  1508. data/test/stub/rails_apps/3.0/empty/app/controllers/application_controller.rb +4 -0
  1509. data/test/stub/rails_apps/3.0/empty/app/helpers/application_helper.rb +2 -0
  1510. data/test/stub/rails_apps/3.0/empty/app/views/layouts/application.html.erb +14 -0
  1511. data/test/stub/rails_apps/3.0/empty/config.ru +4 -0
  1512. data/test/stub/rails_apps/3.0/empty/config/application.rb +48 -0
  1513. data/test/stub/rails_apps/3.0/empty/config/boot.rb +13 -0
  1514. data/test/stub/rails_apps/3.0/empty/config/database.yml +22 -0
  1515. data/test/stub/rails_apps/3.0/empty/config/environment.rb +5 -0
  1516. data/test/stub/rails_apps/3.0/empty/config/environments/development.rb +19 -0
  1517. data/test/stub/rails_apps/3.0/empty/config/environments/production.rb +48 -0
  1518. data/test/stub/rails_apps/3.0/empty/config/environments/test.rb +32 -0
  1519. data/test/stub/rails_apps/3.0/empty/config/initializers/backtrace_silencers.rb +7 -0
  1520. data/test/stub/rails_apps/3.0/empty/config/initializers/inflections.rb +10 -0
  1521. data/test/stub/rails_apps/3.0/empty/config/initializers/mime_types.rb +5 -0
  1522. data/test/stub/rails_apps/3.0/empty/config/initializers/passenger.rb +1 -0
  1523. data/test/stub/rails_apps/3.0/empty/config/initializers/secret_token.rb +7 -0
  1524. data/test/stub/rails_apps/3.0/empty/config/initializers/session_store.rb +8 -0
  1525. data/test/stub/rails_apps/3.0/empty/config/locales/en.yml +5 -0
  1526. data/test/stub/rails_apps/3.0/empty/config/routes.rb +58 -0
  1527. data/test/stub/rails_apps/3.0/empty/db/seeds.rb +7 -0
  1528. data/test/stub/rails_apps/3.0/empty/doc/README_FOR_APP +2 -0
  1529. data/test/stub/rails_apps/3.0/empty/public/404.html +26 -0
  1530. data/test/stub/rails_apps/3.0/empty/public/422.html +26 -0
  1531. data/test/stub/rails_apps/3.0/empty/public/500.html +26 -0
  1532. data/test/stub/rails_apps/3.0/empty/public/favicon.ico +0 -0
  1533. data/test/stub/rails_apps/3.0/empty/public/index.html +279 -0
  1534. data/test/stub/rails_apps/3.0/empty/public/robots.txt +5 -0
  1535. data/test/stub/rails_apps/3.0/empty/script/rails +9 -0
  1536. data/test/stub/rails_apps/3.0/empty/test/performance/browsing_test.rb +9 -0
  1537. data/test/stub/rails_apps/3.0/empty/test/test_helper.rb +13 -0
  1538. data/test/stub/spawn_server.rb +22 -0
  1539. data/test/stub/upload_data.txt +494 -0
  1540. data/test/stub/vendor_rails/minimal/README +1 -0
  1541. data/test/stub/vendor_rails/minimal/actionmailer/lib/action_mailer.rb +0 -0
  1542. data/test/stub/vendor_rails/minimal/actionpack/lib/action_controller.rb +22 -0
  1543. data/test/stub/vendor_rails/minimal/actionpack/lib/action_pack.rb +0 -0
  1544. data/test/stub/vendor_rails/minimal/actionpack/lib/action_view.rb +0 -0
  1545. data/test/stub/vendor_rails/minimal/activerecord/lib/active_record.rb +7 -0
  1546. data/test/stub/vendor_rails/minimal/activeresource/lib/active_resource.rb +0 -0
  1547. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support.rb +17 -0
  1548. data/test/stub/vendor_rails/minimal/activesupport/lib/active_support/whiny_nil.rb +0 -0
  1549. data/test/stub/vendor_rails/minimal/railties/lib/dispatcher.rb +0 -0
  1550. data/test/stub/vendor_rails/minimal/railties/lib/initializer.rb +57 -0
  1551. data/test/stub/vendor_rails/minimal/railties/lib/ruby_version_check.rb +1 -0
  1552. data/test/stub/wsgi/passenger_wsgi.py +3 -0
  1553. data/test/stub/wsgi/public/wsgi-snake.jpg +0 -0
  1554. data/test/stub/zsfa/header.png +0 -0
  1555. data/test/stub/zsfa/index.html +14 -0
  1556. data/test/stub/zsfa/zsfa.png +0 -0
  1557. data/test/support/allocate_memory.c +14 -0
  1558. data/test/support/apache2_controller.rb +258 -0
  1559. data/test/support/multipart.rb +62 -0
  1560. data/test/support/nginx_controller.rb +99 -0
  1561. data/test/support/test_helper.rb +448 -0
  1562. data/test/support/valgrind.h +2539 -0
  1563. data/test/tut/tut.h +1240 -0
  1564. data/test/tut/tut_reporter.h +256 -0
  1565. metadata +1703 -0
@@ -0,0 +1,275 @@
1
+ // Copyright (c) 2005, Google Inc.
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are
6
+ // met:
7
+ //
8
+ // * Redistributions of source code must retain the above copyright
9
+ // notice, this list of conditions and the following disclaimer.
10
+ // * Redistributions in binary form must reproduce the above
11
+ // copyright notice, this list of conditions and the following disclaimer
12
+ // in the documentation and/or other materials provided with the
13
+ // distribution.
14
+ // * Neither the name of Google Inc. nor the names of its
15
+ // contributors may be used to endorse or promote products derived from
16
+ // this software without specific prior written permission.
17
+ //
18
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ // ---
31
+ // Author: Craig Silverstein
32
+ //
33
+ // This is just a very thin wrapper over sparsehashtable.h, just
34
+ // like sgi stl's stl_hash_set is a very thin wrapper over
35
+ // stl_hashtable. The major thing we define is operator[], because
36
+ // we have a concept of a data_type which stl_hashtable doesn't
37
+ // (it only has a key and a value).
38
+ //
39
+ // This is more different from sparse_hash_map than you might think,
40
+ // because all iterators for sets are const (you obviously can't
41
+ // change the key, and for sets there is no value).
42
+ //
43
+ // We adhere mostly to the STL semantics for hash-set. One important
44
+ // exception is that insert() invalidates iterators entirely. On the
45
+ // plus side, though, delete() doesn't invalidate iterators at all, or
46
+ // even change the ordering of elements.
47
+ //
48
+ // Here are a few "power user" tips:
49
+ //
50
+ // 1) set_deleted_key():
51
+ // Unlike STL's hash_map, if you want to use erase() you
52
+ // *must* call set_deleted_key() after construction.
53
+ //
54
+ // 2) resize(0):
55
+ // When an item is deleted, its memory isn't freed right
56
+ // away. This allows you to iterate over a hashtable,
57
+ // and call erase(), without invalidating the iterator.
58
+ // To force the memory to be freed, call resize(0).
59
+ // For tr1 compatibility, this can also be called as rehash(0).
60
+ //
61
+ // 3) min_load_factor(0.0)
62
+ // Setting the minimum load factor to 0.0 guarantees that
63
+ // the hash table will never shrink.
64
+ //
65
+ // Guide to what kind of hash_set to use:
66
+ // (1) dense_hash_set: fastest, uses the most memory
67
+ // (2) sparse_hash_set: slowest, uses the least memory
68
+ // (3) hash_set /unordered_set (STL): in the middle
69
+ // Typically I use sparse_hash_set when I care about space and/or when
70
+ // I need to save the hashtable on disk. I use hash_set otherwise. I
71
+ // don't personally use dense_hash_set ever; some people use it for
72
+ // small sets with lots of lookups.
73
+ //
74
+ // - dense_hash_set has, typically, a factor of 2 memory overhead (if your
75
+ // data takes up X bytes, the hash_set uses X more bytes in overhead).
76
+ // - sparse_hash_set has about 2 bits overhead per entry.
77
+ // - sparse_hash_map can be 3-7 times slower than the others for lookup and,
78
+ // especially, inserts. See time_hash_map.cc for details.
79
+ //
80
+ // See /usr/(local/)?doc/sparsehash-*/sparse_hash_set.html
81
+ // for information about how to use this class.
82
+
83
+ #ifndef _SPARSE_HASH_SET_H_
84
+ #define _SPARSE_HASH_SET_H_
85
+
86
+ #include <google/sparsehash/sparseconfig.h>
87
+ #include <stdio.h> // for FILE * in read()/write()
88
+ #include <algorithm> // for the default template args
89
+ #include <functional> // for equal_to
90
+ #include <memory> // for alloc<>
91
+ #include <utility> // for pair<>
92
+ #include HASH_FUN_H // defined in config.h
93
+ #include <google/sparsehash/sparsehashtable.h>
94
+
95
+ _START_GOOGLE_NAMESPACE_
96
+
97
+ using STL_NAMESPACE::pair;
98
+
99
+ template <class Value,
100
+ class HashFcn = SPARSEHASH_HASH<Value>, // defined in sparseconfig.h
101
+ class EqualKey = STL_NAMESPACE::equal_to<Value>,
102
+ class Alloc = STL_NAMESPACE::allocator<Value> >
103
+ class sparse_hash_set {
104
+ private:
105
+ // Apparently identity is not stl-standard, so we define our own
106
+ struct Identity {
107
+ Value& operator()(Value& v) const { return v; }
108
+ const Value& operator()(const Value& v) const { return v; }
109
+ };
110
+ struct SetKey {
111
+ void operator()(Value* value, const Value& new_key) const {
112
+ *value = new_key;
113
+ }
114
+ };
115
+
116
+ // The actual data
117
+ typedef sparse_hashtable<Value, Value, HashFcn,
118
+ Identity, SetKey, EqualKey, Alloc> ht;
119
+ ht rep;
120
+
121
+ public:
122
+ typedef typename ht::key_type key_type;
123
+ typedef typename ht::value_type value_type;
124
+ typedef typename ht::hasher hasher;
125
+ typedef typename ht::key_equal key_equal;
126
+ typedef Alloc allocator_type;
127
+
128
+ typedef typename ht::size_type size_type;
129
+ typedef typename ht::difference_type difference_type;
130
+ typedef typename ht::const_pointer pointer;
131
+ typedef typename ht::const_pointer const_pointer;
132
+ typedef typename ht::const_reference reference;
133
+ typedef typename ht::const_reference const_reference;
134
+
135
+ typedef typename ht::const_iterator iterator;
136
+ typedef typename ht::const_iterator const_iterator;
137
+ typedef typename ht::const_local_iterator local_iterator;
138
+ typedef typename ht::const_local_iterator const_local_iterator;
139
+
140
+
141
+ // Iterator functions -- recall all iterators are const
142
+ iterator begin() const { return rep.begin(); }
143
+ iterator end() const { return rep.end(); }
144
+
145
+ // These come from tr1's unordered_set. For us, a bucket has 0 or 1 elements.
146
+ local_iterator begin(size_type i) const { return rep.begin(i); }
147
+ local_iterator end(size_type i) const { return rep.end(i); }
148
+
149
+
150
+ // Accessor functions
151
+ // TODO(csilvers): implement Alloc get_allocator() const;
152
+ hasher hash_funct() const { return rep.hash_funct(); }
153
+ hasher hash_function() const { return hash_funct(); } // tr1 name
154
+ key_equal key_eq() const { return rep.key_eq(); }
155
+
156
+
157
+ // Constructors
158
+ explicit sparse_hash_set(size_type expected_max_items_in_table = 0,
159
+ const hasher& hf = hasher(),
160
+ const key_equal& eql = key_equal())
161
+ : rep(expected_max_items_in_table, hf, eql) { }
162
+
163
+ template <class InputIterator>
164
+ sparse_hash_set(InputIterator f, InputIterator l,
165
+ size_type expected_max_items_in_table = 0,
166
+ const hasher& hf = hasher(),
167
+ const key_equal& eql = key_equal())
168
+ : rep(expected_max_items_in_table, hf, eql) {
169
+ rep.insert(f, l);
170
+ }
171
+ // We use the default copy constructor
172
+ // We use the default operator=()
173
+ // We use the default destructor
174
+
175
+ void clear() { rep.clear(); }
176
+ void swap(sparse_hash_set& hs) { rep.swap(hs.rep); }
177
+
178
+
179
+ // Functions concerning size
180
+ size_type size() const { return rep.size(); }
181
+ size_type max_size() const { return rep.max_size(); }
182
+ bool empty() const { return rep.empty(); }
183
+ size_type bucket_count() const { return rep.bucket_count(); }
184
+ size_type max_bucket_count() const { return rep.max_bucket_count(); }
185
+
186
+ // These are tr1 methods. bucket() is the bucket the key is or would be in.
187
+ size_type bucket_size(size_type i) const { return rep.bucket_size(i); }
188
+ size_type bucket(const key_type& key) const { return rep.bucket(key); }
189
+ float load_factor() const {
190
+ return size() * 1.0f / bucket_count();
191
+ }
192
+ float max_load_factor() const {
193
+ float shrink, grow;
194
+ rep.get_resizing_parameters(&shrink, &grow);
195
+ return grow;
196
+ }
197
+ void max_load_factor(float new_grow) {
198
+ float shrink, grow;
199
+ rep.get_resizing_parameters(&shrink, &grow);
200
+ rep.set_resizing_parameters(shrink, new_grow);
201
+ }
202
+ // These aren't tr1 methods but perhaps ought to be.
203
+ float min_load_factor() const {
204
+ float shrink, grow;
205
+ rep.get_resizing_parameters(&shrink, &grow);
206
+ return shrink;
207
+ }
208
+ void min_load_factor(float new_shrink) {
209
+ float shrink, grow;
210
+ rep.get_resizing_parameters(&shrink, &grow);
211
+ rep.set_resizing_parameters(new_shrink, grow);
212
+ }
213
+ // Deprecated; use min_load_factor() or max_load_factor() instead.
214
+ void set_resizing_parameters(float shrink, float grow) {
215
+ return rep.set_resizing_parameters(shrink, grow);
216
+ }
217
+
218
+ void resize(size_type hint) { rep.resize(hint); }
219
+ void rehash(size_type hint) { resize(hint); } // the tr1 name
220
+
221
+ // Lookup routines
222
+ iterator find(const key_type& key) const { return rep.find(key); }
223
+
224
+ size_type count(const key_type& key) const { return rep.count(key); }
225
+
226
+ pair<iterator, iterator> equal_range(const key_type& key) const {
227
+ return rep.equal_range(key);
228
+ }
229
+
230
+ // Insertion routines
231
+ pair<iterator, bool> insert(const value_type& obj) {
232
+ pair<typename ht::iterator, bool> p = rep.insert(obj);
233
+ return pair<iterator, bool>(p.first, p.second); // const to non-const
234
+ }
235
+ template <class InputIterator>
236
+ void insert(InputIterator f, InputIterator l) { rep.insert(f, l); }
237
+ void insert(const_iterator f, const_iterator l) { rep.insert(f, l); }
238
+ // required for std::insert_iterator; the passed-in iterator is ignored
239
+ iterator insert(iterator, const value_type& obj) { return insert(obj).first; }
240
+
241
+
242
+ // Deletion routines
243
+ // THESE ARE NON-STANDARD! I make you specify an "impossible" key
244
+ // value to identify deleted buckets. You can change the key as
245
+ // time goes on, or get rid of it entirely to be insert-only.
246
+ void set_deleted_key(const key_type& key) { rep.set_deleted_key(key); }
247
+ void clear_deleted_key() { rep.clear_deleted_key(); }
248
+
249
+ // These are standard
250
+ size_type erase(const key_type& key) { return rep.erase(key); }
251
+ void erase(iterator it) { rep.erase(it); }
252
+ void erase(iterator f, iterator l) { rep.erase(f, l); }
253
+
254
+
255
+ // Comparison
256
+ bool operator==(const sparse_hash_set& hs) const { return rep == hs.rep; }
257
+ bool operator!=(const sparse_hash_set& hs) const { return rep != hs.rep; }
258
+
259
+
260
+ // I/O -- this is an add-on for writing metainformation to disk
261
+ bool write_metadata(FILE *fp) { return rep.write_metadata(fp); }
262
+ bool read_metadata(FILE *fp) { return rep.read_metadata(fp); }
263
+ bool write_nopointer_data(FILE *fp) { return rep.write_nopointer_data(fp); }
264
+ bool read_nopointer_data(FILE *fp) { return rep.read_nopointer_data(fp); }
265
+ };
266
+
267
+ template <class Val, class HashFcn, class EqualKey, class Alloc>
268
+ inline void swap(sparse_hash_set<Val, HashFcn, EqualKey, Alloc>& hs1,
269
+ sparse_hash_set<Val, HashFcn, EqualKey, Alloc>& hs2) {
270
+ hs1.swap(hs2);
271
+ }
272
+
273
+ _END_GOOGLE_NAMESPACE_
274
+
275
+ #endif /* _SPARSE_HASH_SET_H_ */
@@ -0,0 +1,1062 @@
1
+ // Copyright (c) 2005, Google Inc.
2
+ // All rights reserved.
3
+ //
4
+ // Redistribution and use in source and binary forms, with or without
5
+ // modification, are permitted provided that the following conditions are
6
+ // met:
7
+ //
8
+ // * Redistributions of source code must retain the above copyright
9
+ // notice, this list of conditions and the following disclaimer.
10
+ // * Redistributions in binary form must reproduce the above
11
+ // copyright notice, this list of conditions and the following disclaimer
12
+ // in the documentation and/or other materials provided with the
13
+ // distribution.
14
+ // * Neither the name of Google Inc. nor the names of its
15
+ // contributors may be used to endorse or promote products derived from
16
+ // this software without specific prior written permission.
17
+ //
18
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ // ---
31
+ // Author: Craig Silverstein
32
+ //
33
+ // A dense hashtable is a particular implementation of
34
+ // a hashtable: one that is meant to minimize memory allocation.
35
+ // It does this by using an array to store all the data. We
36
+ // steal a value from the key space to indicate "empty" array
37
+ // elements (ie indices where no item lives) and another to indicate
38
+ // "deleted" elements.
39
+ //
40
+ // (Note it is possible to change the value of the delete key
41
+ // on the fly; you can even remove it, though after that point
42
+ // the hashtable is insert_only until you set it again. The empty
43
+ // value however can't be changed.)
44
+ //
45
+ // To minimize allocation and pointer overhead, we use internal
46
+ // probing, in which the hashtable is a single table, and collisions
47
+ // are resolved by trying to insert again in another bucket. The
48
+ // most cache-efficient internal probing schemes are linear probing
49
+ // (which suffers, alas, from clumping) and quadratic probing, which
50
+ // is what we implement by default.
51
+ //
52
+ // Type requirements: value_type is required to be Copy Constructible
53
+ // and Default Constructible. It is not required to be (and commonly
54
+ // isn't) Assignable.
55
+ //
56
+ // You probably shouldn't use this code directly. Use
57
+ // <google/dense_hash_map> or <google/dense_hash_set> instead.
58
+
59
+ // You can change the following below:
60
+ // HT_OCCUPANCY_FLT -- how full before we double size
61
+ // HT_EMPTY_FLT -- how empty before we halve size
62
+ // HT_MIN_BUCKETS -- default smallest bucket size
63
+ //
64
+ // You can also change enlarge_resize_percent (which defaults to
65
+ // HT_OCCUPANCY_FLT), and shrink_resize_percent (which defaults to
66
+ // HT_EMPTY_FLT) with set_resizing_parameters().
67
+ //
68
+ // How to decide what values to use?
69
+ // shrink_resize_percent's default of .4 * OCCUPANCY_FLT, is probably good.
70
+ // HT_MIN_BUCKETS is probably unnecessary since you can specify
71
+ // (indirectly) the starting number of buckets at construct-time.
72
+ // For enlarge_resize_percent, you can use this chart to try to trade-off
73
+ // expected lookup time to the space taken up. By default, this
74
+ // code uses quadratic probing, though you can change it to linear
75
+ // via _JUMP below if you really want to.
76
+ //
77
+ // From http://www.augustana.ca/~mohrj/courses/1999.fall/csc210/lecture_notes/hashing.html
78
+ // NUMBER OF PROBES / LOOKUP Successful Unsuccessful
79
+ // Quadratic collision resolution 1 - ln(1-L) - L/2 1/(1-L) - L - ln(1-L)
80
+ // Linear collision resolution [1+1/(1-L)]/2 [1+1/(1-L)2]/2
81
+ //
82
+ // -- enlarge_resize_percent -- 0.10 0.50 0.60 0.75 0.80 0.90 0.99
83
+ // QUADRATIC COLLISION RES.
84
+ // probes/successful lookup 1.05 1.44 1.62 2.01 2.21 2.85 5.11
85
+ // probes/unsuccessful lookup 1.11 2.19 2.82 4.64 5.81 11.4 103.6
86
+ // LINEAR COLLISION RES.
87
+ // probes/successful lookup 1.06 1.5 1.75 2.5 3.0 5.5 50.5
88
+ // probes/unsuccessful lookup 1.12 2.5 3.6 8.5 13.0 50.0 5000.0
89
+
90
+ #ifndef _DENSEHASHTABLE_H_
91
+ #define _DENSEHASHTABLE_H_
92
+
93
+ // The probing method
94
+ // Linear probing
95
+ // #define JUMP_(key, num_probes) ( 1 )
96
+ // Quadratic-ish probing
97
+ #define JUMP_(key, num_probes) ( num_probes )
98
+
99
+
100
+ #include <google/sparsehash/sparseconfig.h>
101
+ #include <assert.h>
102
+ #include <stdio.h>
103
+ #include <stdlib.h> // for abort()
104
+ #include <algorithm> // For swap(), eg
105
+ #include <iostream> // For cerr
106
+ #include <memory> // For uninitialized_fill, uninitialized_copy
107
+ #include <utility> // for pair<>
108
+ #include <iterator> // for facts about iterator tags
109
+ #include <google/type_traits.h> // for true_type, integral_constant, etc.
110
+
111
+ _START_GOOGLE_NAMESPACE_
112
+
113
+ using STL_NAMESPACE::pair;
114
+
115
+ // Hashtable class, used to implement the hashed associative containers
116
+ // hash_set and hash_map.
117
+
118
+ // Value: what is stored in the table (each bucket is a Value).
119
+ // Key: something in a 1-to-1 correspondence to a Value, that can be used
120
+ // to search for a Value in the table (find() takes a Key).
121
+ // HashFcn: Takes a Key and returns an integer, the more unique the better.
122
+ // ExtractKey: given a Value, returns the unique Key associated with it.
123
+ // SetKey: given a Value* and a Key, modifies the value such that
124
+ // ExtractKey(value) == key. We guarantee this is only called
125
+ // with key == deleted_key or key == empty_key.
126
+ // EqualKey: Given two Keys, says whether they are the same (that is,
127
+ // if they are both associated with the same Value).
128
+ // Alloc: STL allocator to use to allocate memory. Currently ignored.
129
+
130
+ template <class Value, class Key, class HashFcn,
131
+ class ExtractKey, class SetKey, class EqualKey, class Alloc>
132
+ class dense_hashtable;
133
+
134
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
135
+ struct dense_hashtable_iterator;
136
+
137
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
138
+ struct dense_hashtable_const_iterator;
139
+
140
+ // We're just an array, but we need to skip over empty and deleted elements
141
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
142
+ struct dense_hashtable_iterator {
143
+ public:
144
+ typedef dense_hashtable_iterator<V,K,HF,ExK,SetK,EqK,A> iterator;
145
+ typedef dense_hashtable_const_iterator<V,K,HF,ExK,SetK,EqK,A> const_iterator;
146
+
147
+ typedef STL_NAMESPACE::forward_iterator_tag iterator_category;
148
+ typedef V value_type;
149
+ typedef ptrdiff_t difference_type;
150
+ typedef size_t size_type;
151
+ typedef V& reference; // Value
152
+ typedef V* pointer;
153
+
154
+ // "Real" constructor and default constructor
155
+ dense_hashtable_iterator(const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *h,
156
+ pointer it, pointer it_end, bool advance)
157
+ : ht(h), pos(it), end(it_end) {
158
+ if (advance) advance_past_empty_and_deleted();
159
+ }
160
+ dense_hashtable_iterator() { }
161
+ // The default destructor is fine; we don't define one
162
+ // The default operator= is fine; we don't define one
163
+
164
+ // Happy dereferencer
165
+ reference operator*() const { return *pos; }
166
+ pointer operator->() const { return &(operator*()); }
167
+
168
+ // Arithmetic. The only hard part is making sure that
169
+ // we're not on an empty or marked-deleted array element
170
+ void advance_past_empty_and_deleted() {
171
+ while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )
172
+ ++pos;
173
+ }
174
+ iterator& operator++() {
175
+ assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;
176
+ }
177
+ iterator operator++(int) { iterator tmp(*this); ++*this; return tmp; }
178
+
179
+ // Comparison.
180
+ bool operator==(const iterator& it) const { return pos == it.pos; }
181
+ bool operator!=(const iterator& it) const { return pos != it.pos; }
182
+
183
+
184
+ // The actual data
185
+ const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *ht;
186
+ pointer pos, end;
187
+ };
188
+
189
+
190
+ // Now do it all again, but with const-ness!
191
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
192
+ struct dense_hashtable_const_iterator {
193
+ public:
194
+ typedef dense_hashtable_iterator<V,K,HF,ExK,SetK,EqK,A> iterator;
195
+ typedef dense_hashtable_const_iterator<V,K,HF,ExK,SetK,EqK,A> const_iterator;
196
+
197
+ typedef STL_NAMESPACE::forward_iterator_tag iterator_category;
198
+ typedef V value_type;
199
+ typedef ptrdiff_t difference_type;
200
+ typedef size_t size_type;
201
+ typedef const V& reference; // Value
202
+ typedef const V* pointer;
203
+
204
+ // "Real" constructor and default constructor
205
+ dense_hashtable_const_iterator(
206
+ const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *h,
207
+ pointer it, pointer it_end, bool advance)
208
+ : ht(h), pos(it), end(it_end) {
209
+ if (advance) advance_past_empty_and_deleted();
210
+ }
211
+ dense_hashtable_const_iterator() { }
212
+ // This lets us convert regular iterators to const iterators
213
+ dense_hashtable_const_iterator(const iterator &it)
214
+ : ht(it.ht), pos(it.pos), end(it.end) { }
215
+ // The default destructor is fine; we don't define one
216
+ // The default operator= is fine; we don't define one
217
+
218
+ // Happy dereferencer
219
+ reference operator*() const { return *pos; }
220
+ pointer operator->() const { return &(operator*()); }
221
+
222
+ // Arithmetic. The only hard part is making sure that
223
+ // we're not on an empty or marked-deleted array element
224
+ void advance_past_empty_and_deleted() {
225
+ while ( pos != end && (ht->test_empty(*this) || ht->test_deleted(*this)) )
226
+ ++pos;
227
+ }
228
+ const_iterator& operator++() {
229
+ assert(pos != end); ++pos; advance_past_empty_and_deleted(); return *this;
230
+ }
231
+ const_iterator operator++(int) { const_iterator tmp(*this); ++*this; return tmp; }
232
+
233
+ // Comparison.
234
+ bool operator==(const const_iterator& it) const { return pos == it.pos; }
235
+ bool operator!=(const const_iterator& it) const { return pos != it.pos; }
236
+
237
+
238
+ // The actual data
239
+ const dense_hashtable<V,K,HF,ExK,SetK,EqK,A> *ht;
240
+ pointer pos, end;
241
+ };
242
+
243
+ template <class Value, class Key, class HashFcn,
244
+ class ExtractKey, class SetKey, class EqualKey, class Alloc>
245
+ class dense_hashtable {
246
+ public:
247
+ typedef Key key_type;
248
+ typedef Value value_type;
249
+ typedef HashFcn hasher;
250
+ typedef EqualKey key_equal;
251
+
252
+ typedef size_t size_type;
253
+ typedef ptrdiff_t difference_type;
254
+ typedef value_type* pointer;
255
+ typedef const value_type* const_pointer;
256
+ typedef value_type& reference;
257
+ typedef const value_type& const_reference;
258
+ typedef dense_hashtable_iterator<Value, Key, HashFcn,
259
+ ExtractKey, SetKey, EqualKey, Alloc>
260
+ iterator;
261
+
262
+ typedef dense_hashtable_const_iterator<Value, Key, HashFcn,
263
+ ExtractKey, SetKey, EqualKey, Alloc>
264
+ const_iterator;
265
+
266
+ // These come from tr1. For us they're the same as regular iterators.
267
+ typedef iterator local_iterator;
268
+ typedef const_iterator const_local_iterator;
269
+
270
+ // How full we let the table get before we resize, by default.
271
+ // Knuth says .8 is good -- higher causes us to probe too much,
272
+ // though it saves memory.
273
+ static const float HT_OCCUPANCY_FLT; // = 0.5;
274
+
275
+ // How empty we let the table get before we resize lower, by default.
276
+ // (0.0 means never resize lower.)
277
+ // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing
278
+ static const float HT_EMPTY_FLT; // = 0.4 * HT_OCCUPANCY_FLT
279
+
280
+ // Minimum size we're willing to let hashtables be.
281
+ // Must be a power of two, and at least 4.
282
+ // Note, however, that for a given hashtable, the initial size is a
283
+ // function of the first constructor arg, and may be >HT_MIN_BUCKETS.
284
+ static const size_t HT_MIN_BUCKETS = 4;
285
+
286
+ // By default, if you don't specify a hashtable size at
287
+ // construction-time, we use this size. Must be a power of two, and
288
+ // at least HT_MIN_BUCKETS.
289
+ static const size_t HT_DEFAULT_STARTING_BUCKETS = 32;
290
+
291
+
292
+ // ITERATOR FUNCTIONS
293
+ iterator begin() { return iterator(this, table,
294
+ table + num_buckets, true); }
295
+ iterator end() { return iterator(this, table + num_buckets,
296
+ table + num_buckets, true); }
297
+ const_iterator begin() const { return const_iterator(this, table,
298
+ table+num_buckets,true);}
299
+ const_iterator end() const { return const_iterator(this, table + num_buckets,
300
+ table+num_buckets,true);}
301
+
302
+ // These come from tr1 unordered_map. They iterate over 'bucket' n.
303
+ // For sparsehashtable, we could consider each 'group' to be a bucket,
304
+ // I guess, but I don't really see the point. We'll just consider
305
+ // bucket n to be the n-th element of the sparsetable, if it's occupied,
306
+ // or some empty element, otherwise.
307
+ local_iterator begin(size_type i) {
308
+ return local_iterator(this, table + i, table + i+1, false);
309
+ }
310
+ local_iterator end(size_type i) {
311
+ local_iterator it = begin(i);
312
+ if (!test_empty(i) && !test_deleted(i))
313
+ ++it;
314
+ return it;
315
+ }
316
+ const_local_iterator begin(size_type i) const {
317
+ return const_local_iterator(this, table + i, table + i+1, false);
318
+ }
319
+ const_local_iterator end(size_type i) const {
320
+ const_local_iterator it = begin(i);
321
+ if (!test_empty(i) && !test_deleted(i))
322
+ ++it;
323
+ return it;
324
+ }
325
+
326
+ // ACCESSOR FUNCTIONS for the things we templatize on, basically
327
+ hasher hash_funct() const { return hash; }
328
+ key_equal key_eq() const { return equals; }
329
+
330
+ private:
331
+ // Annoyingly, we can't copy values around, because they might have
332
+ // const components (they're probably pair<const X, Y>). We use
333
+ // explicit destructor invocation and placement new to get around
334
+ // this. Arg.
335
+ void set_value(value_type* dst, const value_type& src) {
336
+ dst->~value_type();
337
+ new(dst) value_type(src);
338
+ }
339
+
340
+ void destroy_buckets(size_type first, size_type last) {
341
+ for ( ; first != last; ++first)
342
+ table[first].~value_type();
343
+ }
344
+
345
+ // DELETE HELPER FUNCTIONS
346
+ // This lets the user describe a key that will indicate deleted
347
+ // table entries. This key should be an "impossible" entry --
348
+ // if you try to insert it for real, you won't be able to retrieve it!
349
+ // (NB: while you pass in an entire value, only the key part is looked
350
+ // at. This is just because I don't know how to assign just a key.)
351
+ private:
352
+ void squash_deleted() { // gets rid of any deleted entries we have
353
+ if ( num_deleted ) { // get rid of deleted before writing
354
+ dense_hashtable tmp(*this); // copying will get rid of deleted
355
+ swap(tmp); // now we are tmp
356
+ }
357
+ assert(num_deleted == 0);
358
+ }
359
+
360
+ public:
361
+ void set_deleted_key(const key_type &key) {
362
+ // the empty indicator (if specified) and the deleted indicator
363
+ // must be different
364
+ assert(!use_empty || !equals(key, get_key(emptyval)));
365
+ // It's only safe to change what "deleted" means if we purge deleted guys
366
+ squash_deleted();
367
+ use_deleted = true;
368
+ delkey = key;
369
+ }
370
+ void clear_deleted_key() {
371
+ squash_deleted();
372
+ use_deleted = false;
373
+ }
374
+
375
+ // These are public so the iterators can use them
376
+ // True if the item at position bucknum is "deleted" marker
377
+ bool test_deleted(size_type bucknum) const {
378
+ // The num_deleted test is crucial for read(): after read(), the ht values
379
+ // are garbage, and we don't want to think some of them are deleted.
380
+ return (use_deleted && num_deleted > 0 &&
381
+ equals(delkey, get_key(table[bucknum])));
382
+ }
383
+ bool test_deleted(const iterator &it) const {
384
+ return (use_deleted && num_deleted > 0 &&
385
+ equals(delkey, get_key(*it)));
386
+ }
387
+ bool test_deleted(const const_iterator &it) const {
388
+ return (use_deleted && num_deleted > 0 &&
389
+ equals(delkey, get_key(*it)));
390
+ }
391
+ // Set it so test_deleted is true. true if object didn't used to be deleted
392
+ // See below (at erase()) to explain why we allow const_iterators
393
+ bool set_deleted(const_iterator &it) {
394
+ assert(use_deleted); // bad if set_deleted_key() wasn't called
395
+ bool retval = !test_deleted(it);
396
+ // &* converts from iterator to value-type
397
+ set_key(const_cast<value_type*>(&(*it)), delkey);
398
+ return retval;
399
+ }
400
+ // Set it so test_deleted is false. true if object used to be deleted
401
+ bool clear_deleted(const_iterator &it) {
402
+ assert(use_deleted); // bad if set_deleted_key() wasn't called
403
+ // happens automatically when we assign something else in its place
404
+ return test_deleted(it);
405
+ }
406
+
407
+ // EMPTY HELPER FUNCTIONS
408
+ // This lets the user describe a key that will indicate empty (unused)
409
+ // table entries. This key should be an "impossible" entry --
410
+ // if you try to insert it for real, you won't be able to retrieve it!
411
+ // (NB: while you pass in an entire value, only the key part is looked
412
+ // at. This is just because I don't know how to assign just a key.)
413
+ public:
414
+ // These are public so the iterators can use them
415
+ // True if the item at position bucknum is "empty" marker
416
+ bool test_empty(size_type bucknum) const {
417
+ assert(use_empty); // we always need to know what's empty!
418
+ return equals(get_key(emptyval), get_key(table[bucknum]));
419
+ }
420
+ bool test_empty(const iterator &it) const {
421
+ assert(use_empty); // we always need to know what's empty!
422
+ return equals(get_key(emptyval), get_key(*it));
423
+ }
424
+ bool test_empty(const const_iterator &it) const {
425
+ assert(use_empty); // we always need to know what's empty!
426
+ return equals(get_key(emptyval), get_key(*it));
427
+ }
428
+
429
+ private:
430
+ // You can either set a range empty or an individual element
431
+ void set_empty(size_type bucknum) {
432
+ assert(use_empty);
433
+ set_value(&table[bucknum], emptyval);
434
+ }
435
+ void fill_range_with_empty(value_type* table_start, value_type* table_end) {
436
+ // Like set_empty(range), but doesn't destroy previous contents
437
+ STL_NAMESPACE::uninitialized_fill(table_start, table_end, emptyval);
438
+ }
439
+ void set_empty(size_type buckstart, size_type buckend) {
440
+ assert(use_empty);
441
+ destroy_buckets(buckstart, buckend);
442
+ fill_range_with_empty(table + buckstart, table + buckend);
443
+ }
444
+
445
+ public:
446
+ // TODO(csilvers): change all callers of this to pass in a key instead,
447
+ // and take a const key_type instead of const value_type.
448
+ void set_empty_key(const value_type &val) {
449
+ // Once you set the empty key, you can't change it
450
+ assert(!use_empty);
451
+ // The deleted indicator (if specified) and the empty indicator
452
+ // must be different.
453
+ assert(!use_deleted || !equals(get_key(val), delkey));
454
+ use_empty = true;
455
+ set_value(&emptyval, val);
456
+
457
+ assert(!table); // must set before first use
458
+ // num_buckets was set in constructor even though table was NULL
459
+ table = (value_type *) malloc(num_buckets * sizeof(*table));
460
+ assert(table);
461
+ fill_range_with_empty(table, table + num_buckets);
462
+ }
463
+
464
+ // FUNCTIONS CONCERNING SIZE
465
+ public:
466
+ size_type size() const { return num_elements - num_deleted; }
467
+ // Buckets are always a power of 2
468
+ size_type max_size() const { return (size_type(-1) >> 1U) + 1; }
469
+ bool empty() const { return size() == 0; }
470
+ size_type bucket_count() const { return num_buckets; }
471
+ size_type max_bucket_count() const { return max_size(); }
472
+ size_type nonempty_bucket_count() const { return num_elements; }
473
+ // These are tr1 methods. Their idea of 'bucket' doesn't map well to
474
+ // what we do. We just say every bucket has 0 or 1 items in it.
475
+ size_type bucket_size(size_type i) const {
476
+ return begin(i) == end(i) ? 0 : 1;
477
+ }
478
+
479
+
480
+
481
+ private:
482
+ // Because of the above, size_type(-1) is never legal; use it for errors
483
+ static const size_type ILLEGAL_BUCKET = size_type(-1);
484
+
485
+ private:
486
+ // This is the smallest size a hashtable can be without being too crowded
487
+ // If you like, you can give a min #buckets as well as a min #elts
488
+ size_type min_size(size_type num_elts, size_type min_buckets_wanted) {
489
+ size_type sz = HT_MIN_BUCKETS; // min buckets allowed
490
+ while ( sz < min_buckets_wanted || num_elts >= sz * enlarge_resize_percent )
491
+ sz *= 2;
492
+ return sz;
493
+ }
494
+
495
+ // Used after a string of deletes
496
+ void maybe_shrink() {
497
+ assert(num_elements >= num_deleted);
498
+ assert((bucket_count() & (bucket_count()-1)) == 0); // is a power of two
499
+ assert(bucket_count() >= HT_MIN_BUCKETS);
500
+
501
+ // If you construct a hashtable with < HT_DEFAULT_STARTING_BUCKETS,
502
+ // we'll never shrink until you get relatively big, and we'll never
503
+ // shrink below HT_DEFAULT_STARTING_BUCKETS. Otherwise, something
504
+ // like "dense_hash_set<int> x; x.insert(4); x.erase(4);" will
505
+ // shrink us down to HT_MIN_BUCKETS buckets, which is too small.
506
+ if (shrink_threshold > 0 &&
507
+ (num_elements-num_deleted) < shrink_threshold &&
508
+ bucket_count() > HT_DEFAULT_STARTING_BUCKETS ) {
509
+ size_type sz = bucket_count() / 2; // find how much we should shrink
510
+ while ( sz > HT_DEFAULT_STARTING_BUCKETS &&
511
+ (num_elements - num_deleted) < sz * shrink_resize_percent )
512
+ sz /= 2; // stay a power of 2
513
+ dense_hashtable tmp(*this, sz); // Do the actual resizing
514
+ swap(tmp); // now we are tmp
515
+ }
516
+ consider_shrink = false; // because we just considered it
517
+ }
518
+
519
+ // We'll let you resize a hashtable -- though this makes us copy all!
520
+ // When you resize, you say, "make it big enough for this many more elements"
521
+ void resize_delta(size_type delta) {
522
+ if ( consider_shrink ) // see if lots of deletes happened
523
+ maybe_shrink();
524
+ if ( bucket_count() > HT_MIN_BUCKETS &&
525
+ (num_elements + delta) <= enlarge_threshold )
526
+ return; // we're ok as we are
527
+
528
+ // Sometimes, we need to resize just to get rid of all the
529
+ // "deleted" buckets that are clogging up the hashtable. So when
530
+ // deciding whether to resize, count the deleted buckets (which
531
+ // are currently taking up room). But later, when we decide what
532
+ // size to resize to, *don't* count deleted buckets, since they
533
+ // get discarded during the resize.
534
+ const size_type needed_size = min_size(num_elements + delta, 0);
535
+ if ( needed_size > bucket_count() ) { // we don't have enough buckets
536
+ const size_type resize_to = min_size(num_elements - num_deleted + delta,
537
+ 0);
538
+ dense_hashtable tmp(*this, resize_to);
539
+ swap(tmp); // now we are tmp
540
+ }
541
+ }
542
+
543
+ // Increase number of buckets, assuming value_type has trivial copy
544
+ // constructor and destructor. (Really, we want it to have "trivial
545
+ // move", because that's what realloc does. But there's no way to
546
+ // capture that using type_traits, so we pretend that move(x, y) is
547
+ // equivalent to "x.~T(); new(x) T(y);" which is pretty much
548
+ // correct, if a bit conservative.)
549
+ void expand_array(size_t resize_to, true_type) {
550
+ table = (value_type *) realloc(table, resize_to * sizeof(value_type));
551
+ assert(table);
552
+ fill_range_with_empty(table + num_buckets, table + resize_to);
553
+ }
554
+
555
+ // Increase number of buckets, without special assumptions about value_type.
556
+ // TODO(austern): make this exception safe. Handle exceptions from
557
+ // value_type's copy constructor.
558
+ void expand_array(size_t resize_to, false_type) {
559
+ value_type* new_table =
560
+ (value_type *) malloc(resize_to * sizeof(value_type));
561
+ assert(new_table);
562
+ STL_NAMESPACE::uninitialized_copy(table, table + num_buckets, new_table);
563
+ fill_range_with_empty(new_table + num_buckets, new_table + resize_to);
564
+ destroy_buckets(0, num_buckets);
565
+ free(table);
566
+ table = new_table;
567
+ }
568
+
569
+ // Used to actually do the rehashing when we grow/shrink a hashtable
570
+ void copy_from(const dense_hashtable &ht, size_type min_buckets_wanted) {
571
+ clear(); // clear table, set num_deleted to 0
572
+
573
+ // If we need to change the size of our table, do it now
574
+ const size_type resize_to = min_size(ht.size(), min_buckets_wanted);
575
+ if ( resize_to > bucket_count() ) { // we don't have enough buckets
576
+ typedef integral_constant<bool,
577
+ (has_trivial_copy<value_type>::value &&
578
+ has_trivial_destructor<value_type>::value)>
579
+ realloc_ok; // we pretend mv(x,y) == "x.~T(); new(x) T(y)"
580
+ expand_array(resize_to, realloc_ok());
581
+ num_buckets = resize_to;
582
+ reset_thresholds();
583
+ }
584
+
585
+ // We use a normal iterator to get non-deleted bcks from ht
586
+ // We could use insert() here, but since we know there are
587
+ // no duplicates and no deleted items, we can be more efficient
588
+ assert((bucket_count() & (bucket_count()-1)) == 0); // a power of two
589
+ for ( const_iterator it = ht.begin(); it != ht.end(); ++it ) {
590
+ size_type num_probes = 0; // how many times we've probed
591
+ size_type bucknum;
592
+ const size_type bucket_count_minus_one = bucket_count() - 1;
593
+ for (bucknum = hash(get_key(*it)) & bucket_count_minus_one;
594
+ !test_empty(bucknum); // not empty
595
+ bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one) {
596
+ ++num_probes;
597
+ assert(num_probes < bucket_count()); // or else the hashtable is full
598
+ }
599
+ set_value(&table[bucknum], *it); // copies the value to here
600
+ num_elements++;
601
+ }
602
+ }
603
+
604
+ // Required by the spec for hashed associative container
605
+ public:
606
+ // Though the docs say this should be num_buckets, I think it's much
607
+ // more useful as req_elements. As a special feature, calling with
608
+ // req_elements==0 will cause us to shrink if we can, saving space.
609
+ void resize(size_type req_elements) { // resize to this or larger
610
+ if ( consider_shrink || req_elements == 0 )
611
+ maybe_shrink();
612
+ if ( req_elements > num_elements )
613
+ return resize_delta(req_elements - num_elements);
614
+ }
615
+
616
+ // Get and change the value of shrink_resize_percent and
617
+ // enlarge_resize_percent. The description at the beginning of this
618
+ // file explains how to choose the values. Setting the shrink
619
+ // parameter to 0.0 ensures that the table never shrinks.
620
+ void get_resizing_parameters(float* shrink, float* grow) const {
621
+ *shrink = shrink_resize_percent;
622
+ *grow = enlarge_resize_percent;
623
+ }
624
+ void set_resizing_parameters(float shrink, float grow) {
625
+ assert(shrink >= 0.0);
626
+ assert(grow <= 1.0);
627
+ if (shrink > grow/2.0f)
628
+ shrink = grow / 2.0f; // otherwise we thrash hashtable size
629
+ shrink_resize_percent = shrink;
630
+ enlarge_resize_percent = grow;
631
+ reset_thresholds();
632
+ }
633
+
634
+ // CONSTRUCTORS -- as required by the specs, we take a size,
635
+ // but also let you specify a hashfunction, key comparator,
636
+ // and key extractor. We also define a copy constructor and =.
637
+ // DESTRUCTOR -- needs to free the table
638
+ explicit dense_hashtable(size_type expected_max_items_in_table = 0,
639
+ const HashFcn& hf = HashFcn(),
640
+ const EqualKey& eql = EqualKey(),
641
+ const ExtractKey& ext = ExtractKey(),
642
+ const SetKey& set = SetKey())
643
+ : hash(hf), equals(eql), get_key(ext), set_key(set), num_deleted(0),
644
+ use_deleted(false), use_empty(false),
645
+ delkey(), emptyval(), enlarge_resize_percent(HT_OCCUPANCY_FLT),
646
+ shrink_resize_percent(HT_EMPTY_FLT), table(NULL),
647
+ num_buckets(expected_max_items_in_table == 0
648
+ ? HT_DEFAULT_STARTING_BUCKETS
649
+ : min_size(expected_max_items_in_table, 0)),
650
+ num_elements(0) {
651
+ // table is NULL until emptyval is set. However, we set num_buckets
652
+ // here so we know how much space to allocate once emptyval is set
653
+ reset_thresholds();
654
+ }
655
+
656
+ // As a convenience for resize(), we allow an optional second argument
657
+ // which lets you make this new hashtable a different size than ht
658
+ dense_hashtable(const dense_hashtable& ht,
659
+ size_type min_buckets_wanted = HT_DEFAULT_STARTING_BUCKETS)
660
+ : hash(ht.hash), equals(ht.equals),
661
+ get_key(ht.get_key), set_key(ht.set_key), num_deleted(0),
662
+ use_deleted(ht.use_deleted), use_empty(ht.use_empty),
663
+ delkey(ht.delkey), emptyval(ht.emptyval),
664
+ enlarge_resize_percent(ht.enlarge_resize_percent),
665
+ shrink_resize_percent(ht.shrink_resize_percent), table(NULL),
666
+ num_buckets(0), num_elements(0) {
667
+ reset_thresholds();
668
+ copy_from(ht, min_buckets_wanted); // copy_from() ignores deleted entries
669
+ }
670
+
671
+ dense_hashtable& operator= (const dense_hashtable& ht) {
672
+ if (&ht == this) return *this; // don't copy onto ourselves
673
+ clear();
674
+ hash = ht.hash;
675
+ equals = ht.equals;
676
+ get_key = ht.get_key;
677
+ set_key = ht.set_key;
678
+ use_deleted = ht.use_deleted;
679
+ use_empty = ht.use_empty;
680
+ delkey = ht.delkey;
681
+ set_value(&emptyval, ht.emptyval);
682
+ enlarge_resize_percent = ht.enlarge_resize_percent;
683
+ shrink_resize_percent = ht.shrink_resize_percent;
684
+ copy_from(ht, HT_MIN_BUCKETS); // sets num_deleted to 0 too
685
+ return *this;
686
+ }
687
+
688
+ ~dense_hashtable() {
689
+ if (table) {
690
+ destroy_buckets(0, num_buckets);
691
+ free(table);
692
+ }
693
+ }
694
+
695
+ // Many STL algorithms use swap instead of copy constructors
696
+ void swap(dense_hashtable& ht) {
697
+ STL_NAMESPACE::swap(hash, ht.hash);
698
+ STL_NAMESPACE::swap(equals, ht.equals);
699
+ STL_NAMESPACE::swap(get_key, ht.get_key);
700
+ STL_NAMESPACE::swap(set_key, ht.set_key);
701
+ STL_NAMESPACE::swap(num_deleted, ht.num_deleted);
702
+ STL_NAMESPACE::swap(use_deleted, ht.use_deleted);
703
+ STL_NAMESPACE::swap(use_empty, ht.use_empty);
704
+ STL_NAMESPACE::swap(enlarge_resize_percent, ht.enlarge_resize_percent);
705
+ STL_NAMESPACE::swap(shrink_resize_percent, ht.shrink_resize_percent);
706
+ STL_NAMESPACE::swap(delkey, ht.delkey);
707
+ { value_type tmp; // for annoying reasons, swap() doesn't work
708
+ set_value(&tmp, emptyval);
709
+ set_value(&emptyval, ht.emptyval);
710
+ set_value(&ht.emptyval, tmp);
711
+ }
712
+ STL_NAMESPACE::swap(table, ht.table);
713
+ STL_NAMESPACE::swap(num_buckets, ht.num_buckets);
714
+ STL_NAMESPACE::swap(num_elements, ht.num_elements);
715
+ reset_thresholds();
716
+ ht.reset_thresholds();
717
+ }
718
+
719
+ // It's always nice to be able to clear a table without deallocating it
720
+ void clear() {
721
+ if (table)
722
+ destroy_buckets(0, num_buckets);
723
+ num_buckets = min_size(0,0); // our new size
724
+ reset_thresholds();
725
+ table = (value_type *) realloc(table, num_buckets * sizeof(*table));
726
+ assert(table);
727
+ fill_range_with_empty(table, table + num_buckets);
728
+ num_elements = 0;
729
+ num_deleted = 0;
730
+ }
731
+
732
+ // Clear the table without resizing it.
733
+ // Mimicks the stl_hashtable's behaviour when clear()-ing in that it
734
+ // does not modify the bucket count
735
+ void clear_no_resize() {
736
+ if (table) {
737
+ set_empty(0, num_buckets);
738
+ }
739
+ // don't consider to shrink before another erase()
740
+ reset_thresholds();
741
+ num_elements = 0;
742
+ num_deleted = 0;
743
+ }
744
+
745
+ // LOOKUP ROUTINES
746
+ private:
747
+ // Returns a pair of positions: 1st where the object is, 2nd where
748
+ // it would go if you wanted to insert it. 1st is ILLEGAL_BUCKET
749
+ // if object is not found; 2nd is ILLEGAL_BUCKET if it is.
750
+ // Note: because of deletions where-to-insert is not trivial: it's the
751
+ // first deleted bucket we see, as long as we don't find the key later
752
+ pair<size_type, size_type> find_position(const key_type &key) const {
753
+ size_type num_probes = 0; // how many times we've probed
754
+ const size_type bucket_count_minus_one = bucket_count() - 1;
755
+ size_type bucknum = hash(key) & bucket_count_minus_one;
756
+ size_type insert_pos = ILLEGAL_BUCKET; // where we would insert
757
+ while ( 1 ) { // probe until something happens
758
+ if ( test_empty(bucknum) ) { // bucket is empty
759
+ if ( insert_pos == ILLEGAL_BUCKET ) // found no prior place to insert
760
+ return pair<size_type,size_type>(ILLEGAL_BUCKET, bucknum);
761
+ else
762
+ return pair<size_type,size_type>(ILLEGAL_BUCKET, insert_pos);
763
+
764
+ } else if ( test_deleted(bucknum) ) {// keep searching, but mark to insert
765
+ if ( insert_pos == ILLEGAL_BUCKET )
766
+ insert_pos = bucknum;
767
+
768
+ } else if ( equals(key, get_key(table[bucknum])) ) {
769
+ return pair<size_type,size_type>(bucknum, ILLEGAL_BUCKET);
770
+ }
771
+ ++num_probes; // we're doing another probe
772
+ bucknum = (bucknum + JUMP_(key, num_probes)) & bucket_count_minus_one;
773
+ assert(num_probes < bucket_count()); // don't probe too many times!
774
+ }
775
+ }
776
+
777
+ public:
778
+ iterator find(const key_type& key) {
779
+ if ( size() == 0 ) return end();
780
+ pair<size_type, size_type> pos = find_position(key);
781
+ if ( pos.first == ILLEGAL_BUCKET ) // alas, not there
782
+ return end();
783
+ else
784
+ return iterator(this, table + pos.first, table + num_buckets, false);
785
+ }
786
+
787
+ const_iterator find(const key_type& key) const {
788
+ if ( size() == 0 ) return end();
789
+ pair<size_type, size_type> pos = find_position(key);
790
+ if ( pos.first == ILLEGAL_BUCKET ) // alas, not there
791
+ return end();
792
+ else
793
+ return const_iterator(this, table + pos.first, table+num_buckets, false);
794
+ }
795
+
796
+ // This is a tr1 method: the bucket a given key is in, or what bucket
797
+ // it would be put in, if it were to be inserted. Shrug.
798
+ size_type bucket(const key_type& key) const {
799
+ pair<size_type, size_type> pos = find_position(key);
800
+ return pos.first == ILLEGAL_BUCKET ? pos.second : pos.first;
801
+ }
802
+
803
+ // Counts how many elements have key key. For maps, it's either 0 or 1.
804
+ size_type count(const key_type &key) const {
805
+ pair<size_type, size_type> pos = find_position(key);
806
+ return pos.first == ILLEGAL_BUCKET ? 0 : 1;
807
+ }
808
+
809
+ // Likewise, equal_range doesn't really make sense for us. Oh well.
810
+ pair<iterator,iterator> equal_range(const key_type& key) {
811
+ iterator pos = find(key); // either an iterator or end
812
+ if (pos == end()) {
813
+ return pair<iterator,iterator>(pos, pos);
814
+ } else {
815
+ const iterator startpos = pos++;
816
+ return pair<iterator,iterator>(startpos, pos);
817
+ }
818
+ }
819
+ pair<const_iterator,const_iterator> equal_range(const key_type& key) const {
820
+ const_iterator pos = find(key); // either an iterator or end
821
+ if (pos == end()) {
822
+ return pair<const_iterator,const_iterator>(pos, pos);
823
+ } else {
824
+ const const_iterator startpos = pos++;
825
+ return pair<const_iterator,const_iterator>(startpos, pos);
826
+ }
827
+ }
828
+
829
+
830
+ // INSERTION ROUTINES
831
+ private:
832
+ // If you know *this is big enough to hold obj, use this routine
833
+ pair<iterator, bool> insert_noresize(const value_type& obj) {
834
+ // First, double-check we're not inserting delkey or emptyval
835
+ assert(!use_empty || !equals(get_key(obj), get_key(emptyval)));
836
+ assert(!use_deleted || !equals(get_key(obj), delkey));
837
+ const pair<size_type,size_type> pos = find_position(get_key(obj));
838
+ if ( pos.first != ILLEGAL_BUCKET) { // object was already there
839
+ return pair<iterator,bool>(iterator(this, table + pos.first,
840
+ table + num_buckets, false),
841
+ false); // false: we didn't insert
842
+ } else { // pos.second says where to put it
843
+ if ( test_deleted(pos.second) ) { // just replace if it's been del.
844
+ const_iterator delpos(this, table + pos.second, // shrug:
845
+ table + num_buckets, false);// shouldn't need const
846
+ clear_deleted(delpos);
847
+ assert( num_deleted > 0);
848
+ --num_deleted; // used to be, now it isn't
849
+ } else {
850
+ ++num_elements; // replacing an empty bucket
851
+ }
852
+ set_value(&table[pos.second], obj);
853
+ return pair<iterator,bool>(iterator(this, table + pos.second,
854
+ table + num_buckets, false),
855
+ true); // true: we did insert
856
+ }
857
+ }
858
+
859
+ public:
860
+ // This is the normal insert routine, used by the outside world
861
+ pair<iterator, bool> insert(const value_type& obj) {
862
+ resize_delta(1); // adding an object, grow if need be
863
+ return insert_noresize(obj);
864
+ }
865
+
866
+ // When inserting a lot at a time, we specialize on the type of iterator
867
+ template <class InputIterator>
868
+ void insert(InputIterator f, InputIterator l) {
869
+ // specializes on iterator type
870
+ insert(f, l, typename STL_NAMESPACE::iterator_traits<InputIterator>::iterator_category());
871
+ }
872
+
873
+ // Iterator supports operator-, resize before inserting
874
+ template <class ForwardIterator>
875
+ void insert(ForwardIterator f, ForwardIterator l,
876
+ STL_NAMESPACE::forward_iterator_tag) {
877
+ size_type n = STL_NAMESPACE::distance(f, l); // TODO(csilvers): standard?
878
+ resize_delta(n);
879
+ for ( ; n > 0; --n, ++f)
880
+ insert_noresize(*f);
881
+ }
882
+
883
+ // Arbitrary iterator, can't tell how much to resize
884
+ template <class InputIterator>
885
+ void insert(InputIterator f, InputIterator l,
886
+ STL_NAMESPACE::input_iterator_tag) {
887
+ for ( ; f != l; ++f)
888
+ insert(*f);
889
+ }
890
+
891
+
892
+ // DELETION ROUTINES
893
+ size_type erase(const key_type& key) {
894
+ // First, double-check we're not trying to erase delkey or emptyval
895
+ assert(!use_empty || !equals(key, get_key(emptyval)));
896
+ assert(!use_deleted || !equals(key, delkey));
897
+ const_iterator pos = find(key); // shrug: shouldn't need to be const
898
+ if ( pos != end() ) {
899
+ assert(!test_deleted(pos)); // or find() shouldn't have returned it
900
+ set_deleted(pos);
901
+ ++num_deleted;
902
+ consider_shrink = true; // will think about shrink after next insert
903
+ return 1; // because we deleted one thing
904
+ } else {
905
+ return 0; // because we deleted nothing
906
+ }
907
+ }
908
+
909
+ // This is really evil: really it should be iterator, not const_iterator.
910
+ // But...the only reason keys are const is to allow lookup.
911
+ // Since that's a moot issue for deleted keys, we allow const_iterators
912
+ void erase(const_iterator pos) {
913
+ if ( pos == end() ) return; // sanity check
914
+ if ( set_deleted(pos) ) { // true if object has been newly deleted
915
+ ++num_deleted;
916
+ consider_shrink = true; // will think about shrink after next insert
917
+ }
918
+ }
919
+
920
+ void erase(const_iterator f, const_iterator l) {
921
+ for ( ; f != l; ++f) {
922
+ if ( set_deleted(f) ) // should always be true
923
+ ++num_deleted;
924
+ }
925
+ consider_shrink = true; // will think about shrink after next insert
926
+ }
927
+
928
+
929
+ // COMPARISON
930
+ bool operator==(const dense_hashtable& ht) const {
931
+ if (size() != ht.size()) {
932
+ return false;
933
+ } else if (this == &ht) {
934
+ return true;
935
+ } else {
936
+ // Iterate through the elements in "this" and see if the
937
+ // corresponding element is in ht
938
+ for ( const_iterator it = begin(); it != end(); ++it ) {
939
+ const_iterator it2 = ht.find(get_key(*it));
940
+ if ((it2 == ht.end()) || (*it != *it2)) {
941
+ return false;
942
+ }
943
+ }
944
+ return true;
945
+ }
946
+ }
947
+ bool operator!=(const dense_hashtable& ht) const {
948
+ return !(*this == ht);
949
+ }
950
+
951
+
952
+ // I/O
953
+ // We support reading and writing hashtables to disk. Alas, since
954
+ // I don't know how to write a hasher or key_equal, you have to make
955
+ // sure everything but the table is the same. We compact before writing
956
+ //
957
+ // NOTE: These functions are currently TODO. They've not been implemented.
958
+ bool write_metadata(FILE *fp) {
959
+ squash_deleted(); // so we don't have to worry about delkey
960
+ return false; // TODO
961
+ }
962
+
963
+ bool read_metadata(FILE *fp) {
964
+ num_deleted = 0; // since we got rid before writing
965
+ assert(use_empty); // have to set this before calling us
966
+ if (table) free(table); // we'll make our own
967
+ // TODO: read magic number
968
+ // TODO: read num_buckets
969
+ reset_thresholds();
970
+ table = (value_type *) malloc(num_buckets * sizeof(*table));
971
+ assert(table);
972
+ fill_range_with_empty(table, table + num_buckets);
973
+ // TODO: read num_elements
974
+ for ( size_type i = 0; i < num_elements; ++i ) {
975
+ // TODO: read bucket_num
976
+ // TODO: set with non-empty, non-deleted value
977
+ }
978
+ return false; // TODO
979
+ }
980
+
981
+ // If your keys and values are simple enough, we can write them to
982
+ // disk for you. "simple enough" means value_type is a POD type
983
+ // that contains no pointers. However, we don't try to normalize
984
+ // endianness
985
+ bool write_nopointer_data(FILE *fp) const {
986
+ for ( const_iterator it = begin(); it != end(); ++it ) {
987
+ // TODO: skip empty/deleted values
988
+ if ( !fwrite(&*it, sizeof(*it), 1, fp) ) return false;
989
+ }
990
+ return false;
991
+ }
992
+
993
+ // When reading, we have to override the potential const-ness of *it
994
+ bool read_nopointer_data(FILE *fp) {
995
+ for ( iterator it = begin(); it != end(); ++it ) {
996
+ // TODO: skip empty/deleted values
997
+ if ( !fread(reinterpret_cast<void*>(&(*it)), sizeof(*it), 1, fp) )
998
+ return false;
999
+ }
1000
+ return false;
1001
+ }
1002
+
1003
+ private:
1004
+ // The actual data
1005
+ hasher hash; // required by hashed_associative_container
1006
+ key_equal equals;
1007
+ ExtractKey get_key;
1008
+ SetKey set_key;
1009
+ size_type num_deleted; // how many occupied buckets are marked deleted
1010
+ bool use_deleted; // false until delkey has been set
1011
+ bool use_empty; // you must do this before you start
1012
+ // TODO(csilvers): make a pointer, and get rid of use_deleted (benchmark!)
1013
+ key_type delkey; // which key marks deleted entries
1014
+ value_type emptyval; // which key marks unused entries
1015
+ float enlarge_resize_percent; // how full before resize
1016
+ float shrink_resize_percent; // how empty before resize
1017
+ size_type shrink_threshold; // num_buckets * shrink_resize_percent
1018
+ size_type enlarge_threshold; // num_buckets * enlarge_resize_percent
1019
+ value_type *table;
1020
+ size_type num_buckets;
1021
+ size_type num_elements;
1022
+ bool consider_shrink; // true if we should try to shrink before next insert
1023
+
1024
+ void reset_thresholds() {
1025
+ enlarge_threshold = static_cast<size_type>(num_buckets
1026
+ * enlarge_resize_percent);
1027
+ shrink_threshold = static_cast<size_type>(num_buckets
1028
+ * shrink_resize_percent);
1029
+ consider_shrink = false; // whatever caused us to reset already considered
1030
+ }
1031
+ };
1032
+
1033
+ // We need a global swap as well
1034
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
1035
+ inline void swap(dense_hashtable<V,K,HF,ExK,SetK,EqK,A> &x,
1036
+ dense_hashtable<V,K,HF,ExK,SetK,EqK,A> &y) {
1037
+ x.swap(y);
1038
+ }
1039
+
1040
+ #undef JUMP_
1041
+
1042
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
1043
+ const typename dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::size_type
1044
+ dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::ILLEGAL_BUCKET;
1045
+
1046
+ // How full we let the table get before we resize. Knuth says .8 is
1047
+ // good -- higher causes us to probe too much, though saves memory.
1048
+ // However, we go with .5, getting better performance at the cost of
1049
+ // more space (a trade-off densehashtable explicitly chooses to make).
1050
+ // Feel free to play around with different values, though.
1051
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
1052
+ const float dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::HT_OCCUPANCY_FLT = 0.5f;
1053
+
1054
+ // How empty we let the table get before we resize lower.
1055
+ // It should be less than OCCUPANCY_FLT / 2 or we thrash resizing
1056
+ template <class V, class K, class HF, class ExK, class SetK, class EqK, class A>
1057
+ const float dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::HT_EMPTY_FLT
1058
+ = 0.4f * dense_hashtable<V,K,HF,ExK,SetK,EqK,A>::HT_OCCUPANCY_FLT;
1059
+
1060
+ _END_GOOGLE_NAMESPACE_
1061
+
1062
+ #endif /* _DENSEHASHTABLE_H_ */