backports 3.6.0 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +1 -0
  3. data/Gemfile.lock +3 -1
  4. data/README.rdoc +6 -2
  5. data/backports.gemspec +1 -1
  6. data/lib/backports/1.8.7.rb +1 -0
  7. data/lib/backports/1.8.7/argf.rb +1 -1
  8. data/lib/backports/1.8.7/argf/each.rb +1 -1
  9. data/lib/backports/1.8.7/argf/each_byte.rb +1 -1
  10. data/lib/backports/1.8.7/argf/each_char.rb +1 -1
  11. data/lib/backports/1.8.7/argf/each_line.rb +1 -1
  12. data/lib/backports/1.8.7/argf/getbyte.rb +1 -1
  13. data/lib/backports/1.8.7/argf/readbyte.rb +1 -1
  14. data/lib/backports/1.8.7/array.rb +1 -1
  15. data/lib/backports/1.8.7/array/collect.rb +1 -1
  16. data/lib/backports/1.8.7/array/combination.rb +1 -1
  17. data/lib/backports/1.8.7/array/cycle.rb +1 -1
  18. data/lib/backports/1.8.7/array/delete_if.rb +1 -1
  19. data/lib/backports/1.8.7/array/each.rb +1 -1
  20. data/lib/backports/1.8.7/array/each_index.rb +1 -1
  21. data/lib/backports/1.8.7/array/flatten.rb +2 -1
  22. data/lib/backports/1.8.7/array/index.rb +1 -1
  23. data/lib/backports/1.8.7/array/map.rb +1 -1
  24. data/lib/backports/1.8.7/array/permutation.rb +1 -1
  25. data/lib/backports/1.8.7/array/pop.rb +2 -1
  26. data/lib/backports/1.8.7/array/product.rb +1 -1
  27. data/lib/backports/1.8.7/array/reject.rb +1 -1
  28. data/lib/backports/1.8.7/array/reverse_each.rb +1 -1
  29. data/lib/backports/1.8.7/array/rindex.rb +1 -1
  30. data/lib/backports/1.8.7/array/select.rb +1 -1
  31. data/lib/backports/1.8.7/array/shift.rb +2 -1
  32. data/lib/backports/1.8.7/binding.rb +1 -1
  33. data/lib/backports/1.8.7/dir.rb +1 -1
  34. data/lib/backports/1.8.7/dir/each.rb +1 -1
  35. data/lib/backports/1.8.7/enumerable.rb +1 -1
  36. data/lib/backports/1.8.7/enumerable/count.rb +1 -1
  37. data/lib/backports/1.8.7/enumerable/cycle.rb +1 -1
  38. data/lib/backports/1.8.7/enumerable/detect.rb +1 -1
  39. data/lib/backports/1.8.7/enumerable/drop.rb +1 -1
  40. data/lib/backports/1.8.7/enumerable/each_cons.rb +1 -1
  41. data/lib/backports/1.8.7/enumerable/each_slice.rb +1 -1
  42. data/lib/backports/1.8.7/enumerable/each_with_index.rb +1 -1
  43. data/lib/backports/1.8.7/enumerable/entries.rb +1 -1
  44. data/lib/backports/1.8.7/enumerable/find.rb +1 -1
  45. data/lib/backports/1.8.7/enumerable/find_all.rb +1 -1
  46. data/lib/backports/1.8.7/enumerable/find_index.rb +1 -1
  47. data/lib/backports/1.8.7/enumerable/first.rb +1 -1
  48. data/lib/backports/1.8.7/enumerable/inject.rb +2 -1
  49. data/lib/backports/1.8.7/enumerable/max_by.rb +1 -1
  50. data/lib/backports/1.8.7/enumerable/min_by.rb +1 -1
  51. data/lib/backports/1.8.7/enumerable/minmax.rb +1 -1
  52. data/lib/backports/1.8.7/enumerable/minmax_by.rb +1 -1
  53. data/lib/backports/1.8.7/enumerable/partition.rb +1 -1
  54. data/lib/backports/1.8.7/enumerable/reject.rb +1 -1
  55. data/lib/backports/1.8.7/enumerable/select.rb +1 -1
  56. data/lib/backports/1.8.7/enumerable/sort_by.rb +1 -1
  57. data/lib/backports/1.8.7/enumerable/to_a.rb +1 -1
  58. data/lib/backports/1.8.7/enumerator.rb +1 -1
  59. data/lib/backports/1.8.7/enumerator/each.rb +1 -1
  60. data/lib/backports/1.8.7/env.rb +1 -1
  61. data/lib/backports/1.8.7/env/delete_if.rb +1 -1
  62. data/lib/backports/1.8.7/env/each.rb +1 -1
  63. data/lib/backports/1.8.7/env/each_key.rb +1 -1
  64. data/lib/backports/1.8.7/env/each_pair.rb +1 -1
  65. data/lib/backports/1.8.7/env/each_value.rb +1 -1
  66. data/lib/backports/1.8.7/env/reject.rb +1 -1
  67. data/lib/backports/1.8.7/env/select.rb +1 -1
  68. data/lib/backports/1.8.7/fixnum.rb +1 -1
  69. data/lib/backports/1.8.7/float.rb +1 -1
  70. data/lib/backports/1.8.7/gc.rb +1 -1
  71. data/lib/backports/1.8.7/hash.rb +1 -1
  72. data/lib/backports/1.8.7/hash/constructor.rb +1 -1
  73. data/lib/backports/1.8.7/hash/delete_if.rb +1 -1
  74. data/lib/backports/1.8.7/hash/each.rb +1 -1
  75. data/lib/backports/1.8.7/hash/each_key.rb +1 -1
  76. data/lib/backports/1.8.7/hash/each_pair.rb +1 -1
  77. data/lib/backports/1.8.7/hash/each_value.rb +1 -1
  78. data/lib/backports/1.8.7/hash/reject.rb +1 -1
  79. data/lib/backports/1.8.7/hash/select.rb +1 -1
  80. data/lib/backports/1.8.7/integer.rb +1 -1
  81. data/lib/backports/1.8.7/integer/downto.rb +1 -1
  82. data/lib/backports/1.8.7/integer/times.rb +1 -1
  83. data/lib/backports/1.8.7/integer/upto.rb +1 -1
  84. data/lib/backports/1.8.7/io.rb +1 -1
  85. data/lib/backports/1.8.7/io/each.rb +1 -1
  86. data/lib/backports/1.8.7/io/each_byte.rb +1 -1
  87. data/lib/backports/1.8.7/io/each_line.rb +1 -1
  88. data/lib/backports/1.8.7/io/foreach.rb +1 -1
  89. data/lib/backports/1.8.7/io/getbyte.rb +1 -1
  90. data/lib/backports/1.8.7/io/readbyte.rb +1 -1
  91. data/lib/backports/1.8.7/kernel.rb +1 -1
  92. data/lib/backports/1.8.7/method.rb +1 -1
  93. data/lib/backports/1.8.7/method/name.rb +1 -1
  94. data/lib/backports/1.8.7/module.rb +1 -1
  95. data/lib/backports/1.8.7/module/module_exec.rb +1 -1
  96. data/lib/backports/1.8.7/numeric.rb +1 -1
  97. data/lib/backports/1.8.7/numeric/step.rb +1 -1
  98. data/lib/backports/1.8.7/object_space.rb +1 -1
  99. data/lib/backports/1.8.7/object_space/each_object.rb +1 -1
  100. data/lib/backports/1.8.7/process.rb +1 -1
  101. data/lib/backports/1.8.7/range.rb +1 -1
  102. data/lib/backports/1.8.7/range/each.rb +1 -1
  103. data/lib/backports/1.8.7/range/step.rb +1 -1
  104. data/lib/backports/1.8.7/regexp.rb +1 -1
  105. data/lib/backports/1.8.7/regexp/union.rb +1 -1
  106. data/lib/backports/1.8.7/stop_iteration.rb +2 -2
  107. data/lib/backports/1.8.7/string.rb +1 -1
  108. data/lib/backports/1.8.7/string/bytesize.rb +1 -1
  109. data/lib/backports/1.8.7/string/each.rb +1 -1
  110. data/lib/backports/1.8.7/string/each_byte.rb +1 -1
  111. data/lib/backports/1.8.7/string/each_char.rb +1 -1
  112. data/lib/backports/1.8.7/string/each_line.rb +1 -1
  113. data/lib/backports/1.8.7/string/partition.rb +2 -1
  114. data/lib/backports/1.8.7/string/rpartition.rb +1 -1
  115. data/lib/backports/1.8.7/string/upto.rb +1 -1
  116. data/lib/backports/1.8.7/struct.rb +1 -1
  117. data/lib/backports/1.8.7/struct/each.rb +1 -1
  118. data/lib/backports/1.8.7/struct/each_pair.rb +1 -1
  119. data/lib/backports/1.8.7/symbol.rb +1 -1
  120. data/lib/backports/1.9.1/array.rb +1 -1
  121. data/lib/backports/1.9.1/array/sample.rb +1 -1
  122. data/lib/backports/1.9.1/array/try_convert.rb +1 -1
  123. data/lib/backports/1.9.1/dir.rb +1 -1
  124. data/lib/backports/1.9.1/dir/to_path.rb +1 -1
  125. data/lib/backports/1.9.1/enumerable.rb +1 -1
  126. data/lib/backports/1.9.1/enumerable/each_with_index.rb +1 -1
  127. data/lib/backports/1.9.1/enumerator.rb +1 -1
  128. data/lib/backports/1.9.1/enumerator/new.rb +1 -1
  129. data/lib/backports/1.9.1/enumerator/with_object.rb +1 -1
  130. data/lib/backports/1.9.1/env.rb +1 -1
  131. data/lib/backports/1.9.1/env/key.rb +1 -1
  132. data/lib/backports/1.9.1/file.rb +1 -1
  133. data/lib/backports/1.9.1/file/atime.rb +1 -1
  134. data/lib/backports/1.9.1/file/basename.rb +1 -1
  135. data/lib/backports/1.9.1/file/blockdev.rb +1 -1
  136. data/lib/backports/1.9.1/file/chardev.rb +1 -1
  137. data/lib/backports/1.9.1/file/chmod.rb +1 -1
  138. data/lib/backports/1.9.1/file/chown.rb +1 -1
  139. data/lib/backports/1.9.1/file/ctime.rb +1 -1
  140. data/lib/backports/1.9.1/file/delete.rb +1 -1
  141. data/lib/backports/1.9.1/file/directory.rb +1 -1
  142. data/lib/backports/1.9.1/file/dirname.rb +1 -1
  143. data/lib/backports/1.9.1/file/executable.rb +1 -1
  144. data/lib/backports/1.9.1/file/executable_real.rb +1 -1
  145. data/lib/backports/1.9.1/file/exist.rb +1 -1
  146. data/lib/backports/1.9.1/file/exists.rb +1 -1
  147. data/lib/backports/1.9.1/file/expand_path.rb +1 -1
  148. data/lib/backports/1.9.1/file/extname.rb +1 -1
  149. data/lib/backports/1.9.1/file/file.rb +1 -1
  150. data/lib/backports/1.9.1/file/ftype.rb +1 -1
  151. data/lib/backports/1.9.1/file/grpowned.rb +1 -1
  152. data/lib/backports/1.9.1/file/join.rb +1 -1
  153. data/lib/backports/1.9.1/file/lchmod.rb +1 -1
  154. data/lib/backports/1.9.1/file/lchown.rb +1 -1
  155. data/lib/backports/1.9.1/file/link.rb +1 -1
  156. data/lib/backports/1.9.1/file/lstat.rb +1 -1
  157. data/lib/backports/1.9.1/file/mtime.rb +1 -1
  158. data/lib/backports/1.9.1/file/new.rb +1 -1
  159. data/lib/backports/1.9.1/file/open.rb +3 -2
  160. data/lib/backports/1.9.1/file/owned.rb +1 -1
  161. data/lib/backports/1.9.1/file/pipe.rb +1 -1
  162. data/lib/backports/1.9.1/file/readable.rb +1 -1
  163. data/lib/backports/1.9.1/file/readable_real.rb +1 -1
  164. data/lib/backports/1.9.1/file/readlink.rb +1 -1
  165. data/lib/backports/1.9.1/file/rename.rb +1 -1
  166. data/lib/backports/1.9.1/file/setgid.rb +1 -1
  167. data/lib/backports/1.9.1/file/setuid.rb +1 -1
  168. data/lib/backports/1.9.1/file/size.rb +1 -1
  169. data/lib/backports/1.9.1/file/socket.rb +1 -1
  170. data/lib/backports/1.9.1/file/split.rb +1 -1
  171. data/lib/backports/1.9.1/file/stat.rb +1 -1
  172. data/lib/backports/1.9.1/file/sticky.rb +1 -1
  173. data/lib/backports/1.9.1/file/symlink.rb +1 -1
  174. data/lib/backports/1.9.1/file/to_path.rb +1 -1
  175. data/lib/backports/1.9.1/file/truncate.rb +1 -1
  176. data/lib/backports/1.9.1/file/unlink.rb +1 -1
  177. data/lib/backports/1.9.1/file/writable.rb +1 -1
  178. data/lib/backports/1.9.1/file/writable_real.rb +1 -1
  179. data/lib/backports/1.9.1/file/zero.rb +1 -1
  180. data/lib/backports/1.9.1/float.rb +1 -1
  181. data/lib/backports/1.9.1/float/round.rb +2 -1
  182. data/lib/backports/1.9.1/hash.rb +1 -1
  183. data/lib/backports/1.9.1/hash/default_proc.rb +1 -1
  184. data/lib/backports/1.9.1/hash/key.rb +1 -1
  185. data/lib/backports/1.9.1/hash/try_convert.rb +1 -1
  186. data/lib/backports/1.9.1/integer.rb +1 -1
  187. data/lib/backports/1.9.1/integer/magnitude.rb +1 -1
  188. data/lib/backports/1.9.1/integer/round.rb +2 -1
  189. data/lib/backports/1.9.1/io.rb +1 -1
  190. data/lib/backports/1.9.1/io/binread.rb +1 -1
  191. data/lib/backports/1.9.1/io/open.rb +4 -2
  192. data/lib/backports/1.9.1/io/try_convert.rb +1 -1
  193. data/lib/backports/1.9.1/io/ungetbyte.rb +1 -1
  194. data/lib/backports/1.9.1/kernel.rb +1 -1
  195. data/lib/backports/1.9.1/kernel/require_relative.rb +1 -1
  196. data/lib/backports/1.9.1/math.rb +1 -1
  197. data/lib/backports/1.9.1/math/log.rb +2 -1
  198. data/lib/backports/1.9.1/numeric.rb +1 -1
  199. data/lib/backports/1.9.1/numeric/round.rb +2 -1
  200. data/lib/backports/1.9.1/proc.rb +1 -1
  201. data/lib/backports/1.9.1/proc/lambda.rb +1 -1
  202. data/lib/backports/1.9.1/proc/yield.rb +1 -1
  203. data/lib/backports/1.9.1/range.rb +1 -1
  204. data/lib/backports/1.9.1/range/cover.rb +1 -1
  205. data/lib/backports/1.9.1/regexp.rb +1 -1
  206. data/lib/backports/1.9.1/regexp/try_convert.rb +1 -1
  207. data/lib/backports/1.9.1/string.rb +1 -1
  208. data/lib/backports/1.9.1/string/each_codepoint.rb +1 -1
  209. data/lib/backports/1.9.1/string/getbyte.rb +1 -1
  210. data/lib/backports/1.9.1/string/setbyte.rb +1 -1
  211. data/lib/backports/1.9.1/string/try_convert.rb +1 -1
  212. data/lib/backports/1.9.1/symbol.rb +1 -1
  213. data/lib/backports/1.9.2/array.rb +1 -1
  214. data/lib/backports/1.9.2/array/product.rb +2 -1
  215. data/lib/backports/1.9.2/array/repeated_combination.rb +1 -1
  216. data/lib/backports/1.9.2/array/repeated_permutation.rb +1 -1
  217. data/lib/backports/1.9.2/array/rotate.rb +1 -1
  218. data/lib/backports/1.9.2/array/uniq.rb +2 -2
  219. data/lib/backports/1.9.2/complex.rb +1 -1
  220. data/lib/backports/1.9.2/dir.rb +1 -1
  221. data/lib/backports/1.9.2/enumerable.rb +1 -1
  222. data/lib/backports/1.9.2/enumerable/slice_before.rb +1 -1
  223. data/lib/backports/1.9.2/float.rb +1 -1
  224. data/lib/backports/1.9.2/hash.rb +1 -1
  225. data/lib/backports/1.9.2/kernel.rb +1 -1
  226. data/lib/backports/1.9.2/random.rb +1 -1
  227. data/lib/backports/1.9.3/file.rb +1 -1
  228. data/lib/backports/1.9.3/io.rb +1 -1
  229. data/lib/backports/1.9.3/io/advise.rb +1 -1
  230. data/lib/backports/1.9.3/io/binwrite.rb +1 -1
  231. data/lib/backports/1.9.3/io/write.rb +1 -1
  232. data/lib/backports/1.9.3/string.rb +1 -1
  233. data/lib/backports/1.9.3/string/byteslice.rb +1 -1
  234. data/lib/backports/1.9.3/string/prepend.rb +1 -1
  235. data/lib/backports/2.0.0/array.rb +1 -1
  236. data/lib/backports/2.0.0/enumerable.rb +1 -1
  237. data/lib/backports/2.0.0/enumerable/lazy.rb +1 -1
  238. data/lib/backports/2.0.0/enumerator.rb +1 -1
  239. data/lib/backports/2.0.0/env.rb +1 -1
  240. data/lib/backports/2.0.0/hash.rb +1 -1
  241. data/lib/backports/2.0.0/hash/default_proc.rb +1 -1
  242. data/lib/backports/2.0.0/nil.rb +1 -1
  243. data/lib/backports/2.0.0/range.rb +1 -1
  244. data/lib/backports/2.0.0/struct.rb +1 -1
  245. data/lib/backports/2.1.0/array.rb +1 -1
  246. data/lib/backports/2.1.0/bignum.rb +1 -1
  247. data/lib/backports/2.1.0/enumerable.rb +1 -1
  248. data/lib/backports/2.1.0/enumerable/to_h.rb +1 -1
  249. data/lib/backports/2.1.0/fixnum.rb +1 -1
  250. data/lib/backports/2.1.0/module.rb +1 -1
  251. data/lib/backports/force/enumerable_map.rb +1 -0
  252. data/lib/backports/force/hash_select.rb +1 -0
  253. data/lib/backports/random/MT19937.rb +78 -0
  254. data/lib/backports/random/bits_and_bytes.rb +93 -0
  255. data/lib/backports/random/implementation.rb +94 -0
  256. data/lib/backports/random/load.rb +17 -0
  257. data/lib/backports/std_lib.rb +24 -0
  258. data/lib/backports/tools.rb +2 -357
  259. data/lib/backports/tools/alias_method.rb +8 -0
  260. data/lib/backports/tools/alias_method_chain.rb +26 -0
  261. data/lib/backports/tools/arguments.rb +69 -0
  262. data/lib/backports/tools/extreme_object.rb +12 -0
  263. data/lib/backports/tools/io.rb +57 -0
  264. data/lib/backports/tools/make_block_optional.rb +43 -0
  265. data/lib/backports/tools/path.rb +55 -0
  266. data/lib/backports/tools/require_relative_dir.rb +13 -0
  267. data/lib/backports/tools/std_lib.rb +59 -0
  268. data/lib/backports/tools/suppress_verbose_warnings.rb +9 -0
  269. data/lib/backports/version.rb +1 -1
  270. data/spec/tags/1.8.7/core/module/include_spec.rb +3 -0
  271. metadata +45 -52
  272. data/lib/backports/extra/random/MT19937.rb +0 -76
  273. data/lib/backports/extra/random/bits_and_bytes.rb +0 -91
  274. data/lib/backports/extra/random/implementation.rb +0 -93
  275. data/lib/backports/extra/random/load.rb +0 -17
@@ -1,76 +0,0 @@
1
- class Random
2
- # An implementation of Mersenne Twister MT19937 in Ruby
3
- class MT19937
4
- STATE_SIZE = 624
5
- LAST_STATE = STATE_SIZE - 1
6
- PAD_32_BITS = 0xffffffff
7
-
8
- # See seed=
9
- def initialize(seed)
10
- self.seed = seed
11
- end
12
-
13
- LAST_31_BITS = 0x7fffffff
14
- OFFSET = 397
15
-
16
- # Generates a completely new state out of the previous one.
17
- def next_state
18
- STATE_SIZE.times do |i|
19
- mix = @state[i] & 0x80000000 | @state[i+1 - STATE_SIZE] & 0x7fffffff
20
- @state[i] = @state[i+OFFSET - STATE_SIZE] ^ (mix >> 1)
21
- @state[i] ^= 0x9908b0df if mix.odd?
22
- end
23
- @last_read = -1
24
- end
25
-
26
- # Seed must be either an Integer (only the first 32 bits will be used)
27
- # or an Array of Integers (of which only the first 32 bits will be used)
28
- #
29
- # No conversion or type checking is done at this level
30
- def seed=(seed)
31
- case seed
32
- when Integer
33
- @state = Array.new(STATE_SIZE)
34
- @state[0] = seed & PAD_32_BITS
35
- (1..LAST_STATE).each do |i|
36
- @state[i] = (1812433253 * (@state[i-1] ^ @state[i-1]>>30) + i)& PAD_32_BITS
37
- end
38
- @last_read = LAST_STATE
39
- when Array
40
- self.seed = 19650218
41
- i=1
42
- j=0
43
- [STATE_SIZE, seed.size].max.times do
44
- @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1664525) + j + seed[j] & PAD_32_BITS
45
- if (i+=1) >= STATE_SIZE
46
- @state[0] = @state[-1]
47
- i = 1
48
- end
49
- j = 0 if (j+=1) >= seed.size
50
- end
51
- (STATE_SIZE-1).times do
52
- @state[i] = (@state[i] ^ (@state[i-1] ^ @state[i-1]>>30) * 1566083941) - i & PAD_32_BITS
53
- if (i+=1) >= STATE_SIZE
54
- @state[0] = @state[-1]
55
- i = 1
56
- end
57
- end
58
- @state[0] = 0x80000000
59
- else
60
- raise ArgumentError, "Seed must be an Integer or an Array"
61
- end
62
- end
63
-
64
- # Returns a random Integer from the range 0 ... (1 << 32)
65
- def random_32_bits
66
- next_state if @last_read >= LAST_STATE
67
- @last_read += 1
68
- y = @state[@last_read]
69
- # Tempering
70
- y ^= (y >> 11)
71
- y ^= (y << 7) & 0x9d2c5680
72
- y ^= (y << 15) & 0xefc60000
73
- y ^= (y >> 18)
74
- end
75
- end
76
- end
@@ -1,91 +0,0 @@
1
- class Random
2
- # Supplement the MT19937 class with methods to do
3
- # conversions the same way as MRI.
4
- # No argument checking is done here either.
5
-
6
- class MT19937
7
- FLOAT_FACTOR = 1.0/9007199254740992.0
8
- # generates a random number on [0,1) with 53-bit resolution
9
- def random_float
10
- ((random_32_bits >> 5) * 67108864.0 + (random_32_bits >> 6)) * FLOAT_FACTOR;
11
- end
12
-
13
- # Returns an integer within 0...upto
14
- def random_integer(upto)
15
- n = upto - 1
16
- nb_full_32 = 0
17
- while n > PAD_32_BITS
18
- n >>= 32
19
- nb_full_32 += 1
20
- end
21
- mask = mask_32_bits(n)
22
- begin
23
- rand = random_32_bits & mask
24
- nb_full_32.times do
25
- rand <<= 32
26
- rand |= random_32_bits
27
- end
28
- end until rand < upto
29
- rand
30
- end
31
-
32
- def random_bytes(nb)
33
- nb_32_bits = (nb + 3) / 4
34
- random = nb_32_bits.times.map { random_32_bits }
35
- random.pack("L" * nb_32_bits)[0, nb]
36
- end
37
-
38
- def state_as_bignum
39
- b = 0
40
- @state.each_with_index do |val, i|
41
- b |= val << (32 * i)
42
- end
43
- b
44
- end
45
-
46
- def left # It's actually the number of words left + 1, as per MRI...
47
- MT19937::STATE_SIZE - @last_read
48
- end
49
-
50
- def marshal_dump
51
- [state_as_bignum, left]
52
- end
53
-
54
- def marshal_load(ary)
55
- b, left = ary
56
- @last_read = MT19937::STATE_SIZE - left
57
- @state = Array.new(STATE_SIZE)
58
- STATE_SIZE.times do |i|
59
- @state[i] = b & PAD_32_BITS
60
- b >>= 32
61
- end
62
- end
63
-
64
- # Convert an Integer seed of arbitrary size to either a single 32 bit integer, or an Array of 32 bit integers
65
- def self.convert_seed(seed)
66
- seed = seed.abs
67
- long_values = []
68
- begin
69
- long_values << (seed & PAD_32_BITS)
70
- seed >>= 32
71
- end until seed == 0
72
-
73
- long_values.pop if long_values[-1] == 1 && long_values.size > 1 # Done to allow any kind of sequence of integers
74
-
75
- long_values.size > 1 ? long_values : long_values.first
76
- end
77
-
78
- def self.[](seed)
79
- new(convert_seed(seed))
80
- end
81
-
82
- private
83
- MASK_BY = [1,2,4,8,16]
84
- def mask_32_bits(n)
85
- MASK_BY.each do |shift|
86
- n |= n >> shift
87
- end
88
- n
89
- end
90
- end
91
- end
@@ -1,93 +0,0 @@
1
- class Random
2
- # Implementation corresponding to the actual Random class of Ruby
3
- # The actual random generator (mersenne twister) is in MT19937.
4
- # Ruby specific conversions are handled in bits_and_bytes.
5
- # The high level stuff (argument checking) is done here.
6
- #
7
- module Implementation
8
- attr_reader :seed
9
-
10
- def initialize(seed = 0)
11
- super()
12
- srand(seed)
13
- end
14
-
15
- def srand(new_seed = 0)
16
- new_seed = Backports.coerce_to_int(new_seed)
17
- old, @seed = @seed, new_seed.nonzero? || Random.new_seed
18
- @mt = MT19937[ @seed ]
19
- old
20
- end
21
-
22
- def rand(limit = Backports::Undefined)
23
- case limit
24
- when Backports::Undefined
25
- @mt.random_float
26
- when Float
27
- limit * @mt.random_float unless limit <= 0
28
- when Range
29
- _rand_range(limit)
30
- else
31
- limit = Backports.coerce_to_int(limit)
32
- @mt.random_integer(limit) unless limit <= 0
33
- end || raise(ArgumentError, "invalid argument #{limit}")
34
- end
35
-
36
- def bytes(nb)
37
- nb = Backports.coerce_to_int(nb)
38
- raise ArgumentError, "negative size" if nb < 0
39
- @mt.random_bytes(nb)
40
- end
41
-
42
- def ==(other)
43
- other.is_a?(Random) &&
44
- seed == other.seed &&
45
- left == other.send(:left) &&
46
- state == other.send(:state)
47
- end
48
-
49
- def marshal_dump
50
- @mt.marshal_dump << @seed
51
- end
52
-
53
- def marshal_load(ary)
54
- @seed = ary.pop
55
- @mt = MT19937.allocate
56
- @mt.marshal_load(ary)
57
- end
58
-
59
- private
60
- def state
61
- @mt.state_as_bignum
62
- end
63
-
64
- def left
65
- @mt.left
66
- end
67
-
68
- def _rand_range(limit)
69
- range = limit.end - limit.begin
70
- if (!range.is_a?(Float)) && range.respond_to?(:to_int) && range = Backports.coerce_to_int(range)
71
- range += 1 unless limit.exclude_end?
72
- limit.begin + @mt.random_integer(range) unless range <= 0
73
- elsif range = Backports.coerce_to(range, Float, :to_f)
74
- if range < 0
75
- nil
76
- elsif limit.exclude_end?
77
- limit.begin + @mt.random_float * range unless range <= 0
78
- else
79
- # cheat a bit... this will reduce the nb of random bits
80
- loop do
81
- r = @mt.random_float * range * 1.0001
82
- break limit.begin + r unless r > range
83
- end
84
- end
85
- end
86
- end
87
- end
88
-
89
- def self.new_seed
90
- Kernel::srand # use the built-in seed generator
91
- Kernel::srand # return the generated seed
92
- end
93
- end
@@ -1,17 +0,0 @@
1
- require "backports/tools"
2
- require "backports/extra/random/MT19937"
3
- require "backports/extra/random/bits_and_bytes"
4
- require "backports/extra/random/implementation"
5
-
6
- class Random
7
- include Implementation
8
- class << self
9
- include Implementation
10
- end
11
-
12
- def inspect
13
- "#<#{self.class.name}:#{object_id}>"
14
- end
15
-
16
- srand
17
- end