ray 0.0.1 → 0.1.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -1,109 +0,0 @@
1
- /*
2
- * sha2.h
3
- *
4
- * Version 1.0.0beta1
5
- *
6
- * Written by Aaron D. Gifford <me@aarongifford.com>
7
- *
8
- * Copyright 2000 Aaron D. Gifford. All rights reserved.
9
- *
10
- * Redistribution and use in source and binary forms, with or without
11
- * modification, are permitted provided that the following conditions
12
- * are met:
13
- * 1. Redistributions of source code must retain the above copyright
14
- * notice, this list of conditions and the following disclaimer.
15
- * 2. Redistributions in binary form must reproduce the above copyright
16
- * notice, this list of conditions and the following disclaimer in the
17
- * documentation and/or other materials provided with the distribution.
18
- * 3. Neither the name of the copyright holder nor the names of contributors
19
- * may be used to endorse or promote products derived from this software
20
- * without specific prior written permission.
21
- *
22
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``AS IS'' AND
23
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) OR CONTRIBUTOR(S) BE LIABLE
26
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
- * SUCH DAMAGE.
33
- *
34
- */
35
-
36
- /* $RoughId: sha2.h,v 1.3 2002/02/24 08:14:32 knu Exp $ */
37
- /* $Id: sha2.h 11708 2007-02-12 23:01:19Z shyouhei $ */
38
-
39
- #ifndef __SHA2_H__
40
- #define __SHA2_H__
41
-
42
- #ifdef __cplusplus
43
- extern "C" {
44
- #endif
45
-
46
- #include "../defs.h"
47
-
48
-
49
- /*** SHA-256/384/512 Various Length Definitions ***********************/
50
- #define SHA256_BLOCK_LENGTH 64
51
- #define SHA256_DIGEST_LENGTH 32
52
- #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
53
- #define SHA384_BLOCK_LENGTH 128
54
- #define SHA384_DIGEST_LENGTH 48
55
- #define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
56
- #define SHA512_BLOCK_LENGTH 128
57
- #define SHA512_DIGEST_LENGTH 64
58
- #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
59
-
60
-
61
- /*** SHA-256/384/512 Context Structures *******************************/
62
-
63
- typedef struct _SHA256_CTX {
64
- uint32_t state[8];
65
- uint64_t bitcount;
66
- uint8_t buffer[SHA256_BLOCK_LENGTH];
67
- } SHA256_CTX;
68
- typedef struct _SHA512_CTX {
69
- uint64_t state[8];
70
- uint64_t bitcount[2];
71
- uint8_t buffer[SHA512_BLOCK_LENGTH];
72
- } SHA512_CTX;
73
-
74
- typedef SHA512_CTX SHA384_CTX;
75
-
76
-
77
- #ifdef RUBY
78
- #define SHA256_Init rb_Digest_SHA256_Init
79
- #define SHA256_Update rb_Digest_SHA256_Update
80
- #define SHA256_Finish rb_Digest_SHA256_Finish
81
-
82
- #define SHA384_Init rb_Digest_SHA384_Init
83
- #define SHA384_Update rb_Digest_SHA384_Update
84
- #define SHA384_Finish rb_Digest_SHA384_Finish
85
-
86
- #define SHA512_Init rb_Digest_SHA512_Init
87
- #define SHA512_Update rb_Digest_SHA512_Update
88
- #define SHA512_Finish rb_Digest_SHA512_Finish
89
- #endif
90
-
91
- /*** SHA-256/384/512 Function Prototypes ******************************/
92
- void SHA256_Init _((SHA256_CTX *));
93
- void SHA256_Update _((SHA256_CTX*, const uint8_t*, size_t));
94
- void SHA256_Finish _((SHA256_CTX*, uint8_t[SHA256_DIGEST_LENGTH]));
95
-
96
- void SHA384_Init _((SHA384_CTX*));
97
- void SHA384_Update _((SHA384_CTX*, const uint8_t*, size_t));
98
- void SHA384_Finish _((SHA384_CTX*, uint8_t[SHA384_DIGEST_LENGTH]));
99
-
100
- void SHA512_Init _((SHA512_CTX*));
101
- void SHA512_Update _((SHA512_CTX*, const uint8_t*, size_t));
102
- void SHA512_Finish _((SHA512_CTX*, uint8_t[SHA512_DIGEST_LENGTH]));
103
-
104
- #ifdef __cplusplus
105
- }
106
- #endif /* __cplusplus */
107
-
108
- #endif /* __SHA2_H__ */
109
-
@@ -1,52 +0,0 @@
1
- /* $RoughId: sha2init.c,v 1.3 2001/07/13 20:00:43 knu Exp $ */
2
- /* $Id: sha2init.c 11708 2007-02-12 23:01:19Z shyouhei $ */
3
-
4
- #include "../digest.h"
5
- #include "sha2.h"
6
-
7
- #define FOREACH_BITLEN(func) func(256) func(384) func(512)
8
-
9
- #define DEFINE_ALGO_METADATA(bitlen) \
10
- static rb_digest_metadata_t sha##bitlen = { \
11
- RUBY_DIGEST_API_VERSION, \
12
- SHA##bitlen##_DIGEST_LENGTH, \
13
- SHA##bitlen##_BLOCK_LENGTH, \
14
- sizeof(SHA##bitlen##_CTX), \
15
- (rb_digest_hash_init_func_t)SHA##bitlen##_Init, \
16
- (rb_digest_hash_update_func_t)SHA##bitlen##_Update, \
17
- (rb_digest_hash_finish_func_t)SHA##bitlen##_Finish, \
18
- };
19
-
20
- FOREACH_BITLEN(DEFINE_ALGO_METADATA)
21
-
22
- /*
23
- * Classes for calculating message digests using the SHA-256/384/512
24
- * Secure Hash Algorithm(s) by NIST (the US' National Institute of
25
- * Standards and Technology), described in FIPS PUB 180-2.
26
- */
27
- void
28
- Init_sha2()
29
- {
30
- VALUE mDigest, cDigest_Base;
31
- ID id_metadata;
32
-
33
- #define DECLARE_ALGO_CLASS(bitlen) \
34
- VALUE cDigest_SHA##bitlen;
35
-
36
- FOREACH_BITLEN(DECLARE_ALGO_CLASS)
37
-
38
- // rb_require("digest"); (Commenting this avoids strange errors)
39
-
40
- id_metadata = rb_intern("metadata");
41
-
42
- mDigest = rb_path2class("Digest");
43
- cDigest_Base = rb_path2class("Digest::Base");
44
-
45
- #define DEFINE_ALGO_CLASS(bitlen) \
46
- cDigest_SHA##bitlen = rb_define_class_under(mDigest, "SHA" #bitlen, cDigest_Base); \
47
- \
48
- rb_ivar_set(cDigest_SHA##bitlen, id_metadata, \
49
- Data_Wrap_Struct(rb_cObject, 0, 0, &sha##bitlen));
50
-
51
- FOREACH_BITLEN(DEFINE_ALGO_CLASS)
52
- }
@@ -1,298 +0,0 @@
1
- /************************************************
2
-
3
- enumerator.c - provides Enumerator class
4
-
5
- $Author: shyouhei $
6
-
7
- Copyright (C) 2001-2003 Akinori MUSHA
8
-
9
- $Idaemons: /home/cvs/rb/enumerator/enumerator.c,v 1.1.1.1 2001/07/15 10:12:48 knu Exp $
10
- $RoughId: enumerator.c,v 1.6 2003/07/27 11:03:24 nobu Exp $
11
- $Id: enumerator.c 11708 2007-02-12 23:01:19Z shyouhei $
12
-
13
- ************************************************/
14
-
15
- #include <ruby/ruby.h>
16
- #include <ruby/node.h>
17
-
18
- /*
19
- * Document-class: Enumerable::Enumerator
20
- *
21
- * A class which provides a method `each' to be used as an Enumerable
22
- * object.
23
- */
24
- static VALUE rb_cEnumerator;
25
- static ID sym_each, sym_each_with_index, sym_each_slice, sym_each_cons;
26
- static ID id_new, id_enum_obj, id_enum_method, id_enum_args;
27
-
28
- /*
29
- * call-seq:
30
- * obj.to_enum(method = :each, *args)
31
- * obj.enum_for(method = :each, *args)
32
- *
33
- * Returns Enumerable::Enumerator.new(self, method, *args).
34
- *
35
- * e.g.:
36
- * str = "xyz"
37
- *
38
- * enum = str.enum_for(:each_byte)
39
- * a = enum.map {|b| '%02x' % b } #=> ["78", "79", "7a"]
40
- *
41
- * # protects an array from being modified
42
- * a = [1, 2, 3]
43
- * some_method(a.to_enum)
44
- *
45
- */
46
- static VALUE
47
- obj_to_enum(obj, enum_args)
48
- VALUE obj, enum_args;
49
- {
50
- rb_ary_unshift(enum_args, obj);
51
-
52
- return rb_apply(rb_cEnumerator, id_new, enum_args);
53
- }
54
-
55
- /*
56
- * call-seq:
57
- * enum_with_index
58
- *
59
- * Returns Enumerable::Enumerator.new(self, :each_with_index).
60
- *
61
- */
62
- static VALUE
63
- enumerator_enum_with_index(obj)
64
- VALUE obj;
65
- {
66
- return rb_funcall(rb_cEnumerator, id_new, 2, obj, sym_each_with_index);
67
- }
68
-
69
- static VALUE
70
- each_slice_i(val, memo)
71
- VALUE val;
72
- NODE *memo;
73
- {
74
- VALUE ary = memo->u1.value;
75
- long size = memo->u3.cnt;
76
-
77
- rb_ary_push(ary, val);
78
-
79
- if (RARRAY(ary)->len == size) {
80
- rb_yield(ary);
81
- memo->u1.value = rb_ary_new2(size);
82
- }
83
-
84
- return Qnil;
85
- }
86
-
87
- /*
88
- * call-seq:
89
- * e.each_slice(n) {...}
90
- *
91
- * Iterates the given block for each slice of <n> elements.
92
- *
93
- * e.g.:
94
- * (1..10).each_slice(3) {|a| p a}
95
- * # outputs below
96
- * [1, 2, 3]
97
- * [4, 5, 6]
98
- * [7, 8, 9]
99
- * [10]
100
- *
101
- */
102
- static VALUE
103
- enum_each_slice(obj, n)
104
- VALUE obj, n;
105
- {
106
- long size = NUM2LONG(n);
107
- NODE *memo;
108
- VALUE ary;
109
-
110
- if (size <= 0) rb_raise(rb_eArgError, "invalid slice size");
111
-
112
- memo = rb_node_newnode(NODE_MEMO, rb_ary_new2(size), 0, size);
113
-
114
- rb_iterate(rb_each, obj, each_slice_i, (VALUE)memo);
115
-
116
- ary = memo->u1.value;
117
- if (RARRAY(ary)->len > 0) rb_yield(ary);
118
-
119
- return Qnil;
120
- }
121
-
122
- /*
123
- * call-seq:
124
- * e.enum_slice(n)
125
- *
126
- * Returns Enumerable::Enumerator.new(self, :each_slice, n).
127
- *
128
- */
129
- static VALUE
130
- enumerator_enum_slice(obj, n)
131
- VALUE obj, n;
132
- {
133
- return rb_funcall(rb_cEnumerator, id_new, 3, obj, sym_each_slice, n);
134
- }
135
-
136
- static VALUE
137
- each_cons_i(val, memo)
138
- VALUE val;
139
- NODE *memo;
140
- {
141
- VALUE ary = memo->u1.value;
142
- long size = memo->u3.cnt;
143
-
144
- if (RARRAY(ary)->len == size) {
145
- rb_ary_shift(ary);
146
- }
147
- rb_ary_push(ary, val);
148
- if (RARRAY(ary)->len == size) {
149
- rb_yield(rb_ary_dup(ary));
150
- }
151
- return Qnil;
152
- }
153
-
154
- /*
155
- * call-seq:
156
- * each_cons(n) {...}
157
- *
158
- * Iterates the given block for each array of consecutive <n>
159
- * elements.
160
- *
161
- * e.g.:
162
- * (1..10).each_cons(3) {|a| p a}
163
- * # outputs below
164
- * [1, 2, 3]
165
- * [2, 3, 4]
166
- * [3, 4, 5]
167
- * [4, 5, 6]
168
- * [5, 6, 7]
169
- * [6, 7, 8]
170
- * [7, 8, 9]
171
- * [8, 9, 10]
172
- *
173
- */
174
- static VALUE
175
- enum_each_cons(obj, n)
176
- VALUE obj, n;
177
- {
178
- long size = NUM2LONG(n);
179
- NODE *memo;
180
-
181
- if (size <= 0) rb_raise(rb_eArgError, "invalid size");
182
- memo = rb_node_newnode(NODE_MEMO, rb_ary_new2(size), 0, size);
183
-
184
- rb_iterate(rb_each, obj, each_cons_i, (VALUE)memo);
185
-
186
- return Qnil;
187
- }
188
-
189
- /*
190
- * call-seq:
191
- * e.enum_cons(n)
192
- *
193
- * Returns Enumerable::Enumerator.new(self, :each_cons, n).
194
- *
195
- */
196
- static VALUE
197
- enumerator_enum_cons(obj, n)
198
- VALUE obj, n;
199
- {
200
- return rb_funcall(rb_cEnumerator, id_new, 3, obj, sym_each_cons, n);
201
- }
202
-
203
- /*
204
- * call-seq:
205
- * Enumerable::Enumerator.new(obj, method = :each, *args)
206
- *
207
- * Creates a new Enumerable::Enumerator object, which is to be
208
- * used as an Enumerable object using the given object's given
209
- * method with the given arguments.
210
- *
211
- * e.g.:
212
- * str = "xyz"
213
- *
214
- * enum = Enumerable::Enumerator.new(str, :each_byte)
215
- * a = enum.map {|b| '%02x' % b } #=> ["78", "79", "7a"]
216
- *
217
- */
218
- static VALUE
219
- enumerator_initialize(argc, argv, obj)
220
- int argc;
221
- VALUE *argv;
222
- VALUE obj;
223
- {
224
- VALUE enum_obj, enum_method, enum_args;
225
-
226
- rb_scan_args(argc, argv, "11*", &enum_obj, &enum_method, &enum_args);
227
-
228
- if (enum_method == Qnil)
229
- enum_method = sym_each;
230
-
231
- rb_ivar_set(obj, id_enum_obj, enum_obj);
232
- rb_ivar_set(obj, id_enum_method, enum_method);
233
- rb_ivar_set(obj, id_enum_args, enum_args);
234
-
235
- return Qnil;
236
- }
237
-
238
- static VALUE
239
- enumerator_iter(memo)
240
- NODE *memo;
241
- {
242
- return rb_apply(memo->u1.value, memo->u2.id, memo->u3.value);
243
- }
244
-
245
- /*
246
- * call-seq:
247
- * enum.each {...}
248
- *
249
- * Iterates the given block using the object and the method specified
250
- * in the first place.
251
- *
252
- */
253
- static VALUE
254
- enumerator_each(obj)
255
- VALUE obj;
256
- {
257
- VALUE val;
258
-
259
- obj = (VALUE)rb_node_newnode(NODE_MEMO,
260
- rb_ivar_get(obj, id_enum_obj),
261
- rb_to_id(rb_ivar_get(obj, id_enum_method)),
262
- rb_ivar_get(obj, id_enum_args));
263
- val = rb_iterate((VALUE (*)_((VALUE)))enumerator_iter, obj, rb_yield, 0);
264
- return val;
265
- }
266
-
267
- void
268
- Init_enumerator()
269
- {
270
- VALUE rb_mEnumerable;
271
-
272
- rb_define_method(rb_mKernel, "to_enum", obj_to_enum, -2);
273
- rb_define_method(rb_mKernel, "enum_for", obj_to_enum, -2);
274
-
275
- rb_mEnumerable = rb_path2class("Enumerable");
276
-
277
- rb_define_method(rb_mEnumerable, "enum_with_index", enumerator_enum_with_index, 0);
278
- rb_define_method(rb_mEnumerable, "each_slice", enum_each_slice, 1);
279
- rb_define_method(rb_mEnumerable, "enum_slice", enumerator_enum_slice, 1);
280
- rb_define_method(rb_mEnumerable, "each_cons", enum_each_cons, 1);
281
- rb_define_method(rb_mEnumerable, "enum_cons", enumerator_enum_cons, 1);
282
-
283
- rb_cEnumerator = rb_define_class_under(rb_mEnumerable, "Enumerator", rb_cObject);
284
- rb_include_module(rb_cEnumerator, rb_mEnumerable);
285
-
286
- rb_define_method(rb_cEnumerator, "initialize", enumerator_initialize, -1);
287
- rb_define_method(rb_cEnumerator, "each", enumerator_each, 0);
288
-
289
- sym_each = ID2SYM(rb_intern("each"));
290
- sym_each_with_index = ID2SYM(rb_intern("each_with_index"));
291
- sym_each_slice = ID2SYM(rb_intern("each_slice"));
292
- sym_each_cons = ID2SYM(rb_intern("each_cons"));
293
-
294
- id_new = rb_intern("new");
295
- id_enum_obj = rb_intern("enum_obj");
296
- id_enum_method = rb_intern("enum_method");
297
- id_enum_args = rb_intern("enum_args");
298
- }