ray 0.0.1 → 0.1.0.pre1

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 (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
- }