ruby-fizzbuzz 0.0.2 → 0.0.3
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.
- data.tar.gz.sig +0 -0
- data/CHANGES +16 -0
- data/CHANGES.rdoc +16 -0
- data/README.rdoc +2 -1
- data/TODO +6 -5
- data/VERSION +1 -1
- data/ext/fizzbuzz/extconf.rb +25 -1
- data/ext/fizzbuzz/fizzbuzz.c +145 -47
- data/ext/fizzbuzz/fizzbuzz.h +30 -12
- data/lib/fizzbuzz.rb +20 -20
- data/lib/fizzbuzz/bignum.rb +12 -12
- data/lib/fizzbuzz/integer.rb +11 -11
- data/lib/fizzbuzz/version.rb +1 -1
- metadata +15 -7
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGES
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
fizzbuzz (0.0.3)
|
2
|
+
|
3
|
+
* Added custom exceptions and improved error handling;
|
4
|
+
* Added more variety of Rubies on which tests are being run with Travis CI;
|
5
|
+
* Added project to Rubygems (http://rubygems.org) so it can be installed
|
6
|
+
with just "gem install ruby-fizzbuzz" command;
|
7
|
+
* Renamed project from "fizzbuzz" to "ruby-fizzbuzz" to avoid clashes with
|
8
|
+
other Ruby gems hosted on Rubygems web site;
|
9
|
+
* Made "mkmf" in extconf.rb more user-friendly (it now reports missing
|
10
|
+
build-time dependencies better);
|
11
|
+
* Split Ruby gem specification (or gemspec if you wish) away from Rakefile
|
12
|
+
into its own file (namely ruby-fizzbuzz.gemspec);
|
13
|
+
* Improved documentation and removed bunch of small code smells.
|
14
|
+
|
15
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Sat, 31 Aug 2013 17:54:54 +0000
|
16
|
+
|
1
17
|
fizzbuzz (0.0.2)
|
2
18
|
|
3
19
|
* Added is_fizz?, is_buzz? and is_fizzbuzz? singleton methods to FizzBuzz class;
|
data/CHANGES.rdoc
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
fizzbuzz (0.0.3)
|
2
|
+
|
3
|
+
* Added custom exceptions and improved error handling;
|
4
|
+
* Added more variety of Rubies on which tests are being run with Travis CI;
|
5
|
+
* Added project to Rubygems (http://rubygems.org) so it can be installed
|
6
|
+
with just "gem install ruby-fizzbuzz" command;
|
7
|
+
* Renamed project from "fizzbuzz" to "ruby-fizzbuzz" to avoid clashes with
|
8
|
+
other Ruby gems hosted on Rubygems web site;
|
9
|
+
* Made "mkmf" in extconf.rb more user-friendly (it now reports missing
|
10
|
+
build-time dependencies better);
|
11
|
+
* Split Ruby gem specification (or gemspec if you wish) away from Rakefile
|
12
|
+
into its own file (namely ruby-fizzbuzz.gemspec);
|
13
|
+
* Improved documentation and removed bunch of small code smells.
|
14
|
+
|
15
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Sat, 31 Aug 2013 17:54:54 +0000
|
16
|
+
|
1
17
|
fizzbuzz (0.0.2)
|
2
18
|
|
3
19
|
* Added is_fizz?, is_buzz? and is_fizzbuzz? singleton methods to FizzBuzz class;
|
data/README.rdoc
CHANGED
@@ -4,4 +4,5 @@ to a popular FizzBuzz problem for Ruby.
|
|
4
4
|
Written in C as an example of using Ruby's C API - with the support
|
5
5
|
for arbitrary large numeric values via the Bignum class.
|
6
6
|
|
7
|
-
{<img src="https://travis-ci.org/kwilczynski/ruby-fizzbuzz.png?branch=master"/>}[https://travis-ci.org/kwilczynski/ruby-fizzbuzz]
|
7
|
+
{<img src="https://travis-ci.org/kwilczynski/ruby-fizzbuzz.png?branch=master" alt="Build Status"/>}[https://travis-ci.org/kwilczynski/ruby-fizzbuzz]
|
8
|
+
{<img src="https://badge.fury.io/rb/ruby-fizzbuzz.png" alt="Gem Version" />}[http://badge.fury.io/rb/ruby-fizzbuzz]
|
data/TODO
CHANGED
@@ -4,19 +4,20 @@ fizzbuzz (1.0.0)
|
|
4
4
|
|
5
5
|
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Mon, 01 Oct 2012 17:57:18 +0100
|
6
6
|
|
7
|
-
fizzbuzz (0.0.
|
7
|
+
fizzbuzz (0.0.5)
|
8
8
|
|
9
9
|
* Improve github project page;
|
10
|
-
* Re-factor unit tests to make them more
|
10
|
+
* Re-factor unit tests to make them more idiomatic (maybe move to Rspec and BDD?).
|
11
11
|
|
12
|
-
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com>
|
12
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Sun, 31 Aug 2013 17:50:06 +0000
|
13
13
|
|
14
|
-
fizzbuzz (0.0.
|
14
|
+
fizzbuzz (0.0.4)
|
15
15
|
|
16
|
+
* Move to YARD from RDoc (as RDoc is very bad, really);
|
16
17
|
* Add pure-Ruby implementation;
|
17
18
|
* Add benchmarks;
|
18
19
|
* Add some examples;
|
19
20
|
* Add Doxygen style comments for other functions in the source code;
|
20
21
|
* Improve documentation i.e. source code commenting, README file, etc.
|
21
22
|
|
22
|
-
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com>
|
23
|
+
-- Krzysztof Wilczynski <krzysztof.wilczynski@linux.com> Sun, 31 Aug 2013 17:50:06 +0000
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/ext/fizzbuzz/extconf.rb
CHANGED
@@ -29,7 +29,31 @@ $LDFLAGS << " %s" % ENV['LDFLAGS'] if ENV['LDFLAGS']
|
|
29
29
|
$CFLAGS << " %s" % ENV['CFLAGS'] if ENV['CFLAGS']
|
30
30
|
$CFLAGS << ' -std=c99 -g -Wall -Wextra -pedantic'
|
31
31
|
|
32
|
-
have_header('ruby.h')
|
32
|
+
unless have_header('ruby.h')
|
33
|
+
abort <<-EOS
|
34
|
+
|
35
|
+
You appear to be missing Ruby development libraries and/or header
|
36
|
+
files. You can install missing compile-time dependencies in one of
|
37
|
+
the following ways:
|
38
|
+
|
39
|
+
- Debian / Ubuntu
|
40
|
+
|
41
|
+
apt-get install ruby-dev
|
42
|
+
|
43
|
+
- Red Hat / CentOS / Fedora
|
44
|
+
|
45
|
+
yum install ruby-devel
|
46
|
+
|
47
|
+
|
48
|
+
Alternatively, you can use either of the following Ruby version
|
49
|
+
managers in order to install Ruby locally (for your user only)
|
50
|
+
and/or system-wide:
|
51
|
+
|
52
|
+
- Ruby Version Manager (for RVM, see http://rvm.io/)
|
53
|
+
- Ruby Environment (for rbenv, see http://github.com/sstephenson/rbenv)
|
54
|
+
|
55
|
+
EOS
|
56
|
+
end
|
33
57
|
|
34
58
|
dir_config('fizzbuzz')
|
35
59
|
|
data/ext/fizzbuzz/fizzbuzz.c
CHANGED
@@ -18,19 +18,31 @@
|
|
18
18
|
* limitations under the License.
|
19
19
|
*/
|
20
20
|
|
21
|
-
/* :startdoc: */
|
22
|
-
|
23
21
|
#include <fizzbuzz.h>
|
24
22
|
|
25
23
|
ID id_at_start, id_at_stop;
|
24
|
+
|
26
25
|
VALUE rb_cFizzBuzz = Qnil;
|
27
26
|
|
27
|
+
VALUE rb_fb_eError = Qnil;
|
28
|
+
VALUE rb_fb_eTypeError = Qnil;
|
29
|
+
VALUE rb_fb_eRangeError = Qnil;
|
30
|
+
|
28
31
|
void Init_fizzbuzz(void);
|
29
32
|
|
30
33
|
static VALUE fizzbuzz_evaluate(VALUE value);
|
31
34
|
static VALUE fizzbuzz_values(VALUE object, return_type_t type,
|
32
35
|
direction_t direction);
|
33
36
|
|
37
|
+
static VALUE fizzbuzz_exception_wrapper(VALUE value);
|
38
|
+
static VALUE fizzbuzz_exception(void *data);
|
39
|
+
|
40
|
+
static VALUE fizzbuzz_type_error(VALUE klass, const char *message);
|
41
|
+
static VALUE fizzbuzz_range_error(VALUE klass, VALUE start, VALUE stop,
|
42
|
+
const char *message);
|
43
|
+
|
44
|
+
/* :startdoc: */
|
45
|
+
|
34
46
|
/*
|
35
47
|
* call-seq:
|
36
48
|
* FizzBuzz.new( start, stop ) -> self
|
@@ -48,14 +60,13 @@ static VALUE fizzbuzz_values(VALUE object, return_type_t type,
|
|
48
60
|
* fb = FizzBuzz.new(-15, 15) #=> #<FizzBuzz:0xb6fd0460 @stop=15, @start=-15>
|
49
61
|
*
|
50
62
|
* The given value of +stop+ must always be greater than or equal to the
|
51
|
-
* given value of +start+, otherwise raises an
|
52
|
-
*
|
53
|
-
* Will raise a +TypeError+ exception if given value of either +start+
|
54
|
-
* or +stop+ is not an integer type.
|
63
|
+
* given value of +start+, otherwise raises an <i>FizzBuzz::RangeError</i>
|
64
|
+
* exception.
|
55
65
|
*
|
56
|
-
*
|
66
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value of either
|
67
|
+
* +start+ or +stop+ is not an _Integer_ or _Bignum_ type.
|
57
68
|
*
|
58
|
-
*
|
69
|
+
* See also: FizzBuzz::fizzbuzz
|
59
70
|
*/
|
60
71
|
VALUE
|
61
72
|
rb_fb_initialize(int argc, VALUE *argv, VALUE object)
|
@@ -64,10 +75,10 @@ rb_fb_initialize(int argc, VALUE *argv, VALUE object)
|
|
64
75
|
|
65
76
|
rb_scan_args(argc, argv, "20", &start, &stop);
|
66
77
|
|
67
|
-
CHECK_TYPE(start,
|
68
|
-
CHECK_TYPE(stop,
|
78
|
+
CHECK_TYPE(start, error(E_INVALID_START_TYPE));
|
79
|
+
CHECK_TYPE(stop, error(E_INVALID_STOP_TYPE));
|
69
80
|
|
70
|
-
|
81
|
+
CHECK_RANGE(start, stop, error(E_BAD_VALUE_START));
|
71
82
|
|
72
83
|
rb_ivar_set(object, id_at_start, start);
|
73
84
|
rb_ivar_set(object, id_at_stop, stop);
|
@@ -83,8 +94,8 @@ rb_fb_initialize(int argc, VALUE *argv, VALUE object)
|
|
83
94
|
*
|
84
95
|
* Example:
|
85
96
|
*
|
86
|
-
* fb = FizzBuzz.new(1, 100)
|
87
|
-
* fb.start
|
97
|
+
* fb = FizzBuzz.new(1, 100) #=> #<FizzBuzz:0xf726b48c @stop=100, @start=1>
|
98
|
+
* fb.start #=> 1
|
88
99
|
*/
|
89
100
|
VALUE
|
90
101
|
rb_fb_get_start(VALUE object)
|
@@ -97,25 +108,26 @@ rb_fb_get_start(VALUE object)
|
|
97
108
|
* fizzfuzz.start= (integer) -> integer
|
98
109
|
*
|
99
110
|
* Sets the current value of +start+ if given new value is lower or equal
|
100
|
-
* to the current value of +stop+, or raises an
|
101
|
-
* otherwise.
|
111
|
+
* to the current value of +stop+, or raises an <i>FizzBuzz::RangeError</i>
|
112
|
+
* exception otherwise.
|
102
113
|
*
|
103
114
|
* Examples:
|
104
115
|
*
|
105
|
-
* fb = FizzBuzz.new(1, 100)
|
106
|
-
* fb.start
|
107
|
-
* fb.start = 15
|
108
|
-
* fb.start
|
116
|
+
* fb = FizzBuzz.new(1, 100) #=> #<FizzBuzz:0xf726f03c @stop=100, @start=1>
|
117
|
+
* fb.start #=> 1
|
118
|
+
* fb.start = 15 #=> 15
|
119
|
+
* fb.start #=> 15
|
109
120
|
*
|
110
|
-
* Will raise a
|
121
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value is not
|
122
|
+
* an _Integer_ or _Bignum_ type.
|
111
123
|
*/
|
112
124
|
VALUE
|
113
125
|
rb_fb_set_start(VALUE object, VALUE value)
|
114
126
|
{
|
115
127
|
VALUE stop = rb_ivar_get(object, id_at_stop);
|
116
128
|
|
117
|
-
CHECK_TYPE(value,
|
118
|
-
|
129
|
+
CHECK_TYPE(value, error(E_INVALID_START_TYPE));
|
130
|
+
CHECK_RANGE(value, stop, error(E_BAD_VALUE_START));
|
119
131
|
|
120
132
|
return rb_ivar_set(object, id_at_start, value);
|
121
133
|
}
|
@@ -128,8 +140,8 @@ rb_fb_set_start(VALUE object, VALUE value)
|
|
128
140
|
*
|
129
141
|
* Example:
|
130
142
|
*
|
131
|
-
* fb = FizzBuzz.new(1, 100)
|
132
|
-
* fb.stop
|
143
|
+
* fb = FizzBuzz.new(1, 100) #=> #<FizzBuzz:0xf7272bec @stop=100, @start=1>
|
144
|
+
* fb.stop #=> 100
|
133
145
|
*/
|
134
146
|
VALUE
|
135
147
|
rb_fb_get_stop(VALUE object)
|
@@ -139,28 +151,29 @@ rb_fb_get_stop(VALUE object)
|
|
139
151
|
|
140
152
|
/*
|
141
153
|
* call-seq:
|
142
|
-
* fizzfuzz.
|
154
|
+
* fizzfuzz.stop= (integer) -> integer
|
143
155
|
*
|
144
156
|
* Sets the current value of +stop+ if given new value is greater or equal
|
145
|
-
* to the current value of +start+, or raises an
|
146
|
-
* otherwise.
|
157
|
+
* to the current value of +start+, or raises an <i>FizzBuzz::RangeError</i>
|
158
|
+
* exception otherwise.
|
147
159
|
*
|
148
160
|
* Example:
|
149
161
|
*
|
150
|
-
* fb = FizzBuzz.new(1, 100)
|
151
|
-
* fb.stop
|
152
|
-
* fb.stop = 15
|
153
|
-
* fb.stop
|
162
|
+
* fb = FizzBuzz.new(1, 100) #=> #<FizzBuzz:0xf727679c @stop=100, @start=1>
|
163
|
+
* fb.stop #=> 100
|
164
|
+
* fb.stop = 15 #=> 15
|
165
|
+
* fb.stop #=> 15
|
154
166
|
*
|
155
|
-
* Will raise a
|
167
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value is not
|
168
|
+
* an _Integer_ or _Bignum_ type.
|
156
169
|
*/
|
157
170
|
VALUE
|
158
171
|
rb_fb_set_stop(VALUE object, VALUE value)
|
159
172
|
{
|
160
173
|
VALUE start = rb_ivar_get(object, id_at_start);
|
161
174
|
|
162
|
-
CHECK_TYPE(value,
|
163
|
-
|
175
|
+
CHECK_TYPE(value, error(E_INVALID_STOP_TYPE));
|
176
|
+
CHECK_RANGE(start, value, error(E_BAD_VALUE_STOP));
|
164
177
|
|
165
178
|
return rb_ivar_set(object, id_at_stop, value);
|
166
179
|
}
|
@@ -174,8 +187,8 @@ rb_fb_set_stop(VALUE object, VALUE value)
|
|
174
187
|
*
|
175
188
|
* Example:
|
176
189
|
*
|
177
|
-
* fb = FizzBuzz.new(1, 15)
|
178
|
-
* fb.to_a
|
190
|
+
* fb = FizzBuzz.new(1, 15) #=> #<FizzBuzz:0xf727fd60 @stop=15, @start=1>
|
191
|
+
* fb.to_a #=> [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
|
179
192
|
*
|
180
193
|
* See also: FizzBuzz::fizzbuzz
|
181
194
|
*/
|
@@ -197,7 +210,7 @@ rb_fb_array(VALUE object)
|
|
197
210
|
*
|
198
211
|
* Example:
|
199
212
|
*
|
200
|
-
* fb = FizzBuzz.new(1, 15)
|
213
|
+
* fb = FizzBuzz.new(1, 15) #=> #<FizzBuzz:0xf722f8ec @stop=15, @start=1>
|
201
214
|
* fb.each {|value| puts "Got #{value}" }
|
202
215
|
*
|
203
216
|
* Produces:
|
@@ -239,7 +252,7 @@ rb_fb_enumerator(VALUE object)
|
|
239
252
|
*
|
240
253
|
* If no block is given, an +Enumerator+ is returned instead.
|
241
254
|
*
|
242
|
-
* fb = FizzBuzz.new(1, 15)
|
255
|
+
* fb = FizzBuzz.new(1, 15) #=> #<FizzBuzz:0xb7308664 @stop=15, @start=1>
|
243
256
|
* fb.reverse_each {|value| puts "Got #{value}" }
|
244
257
|
*
|
245
258
|
* Produces:
|
@@ -281,7 +294,8 @@ rb_fb_reverse_enumerator(VALUE object)
|
|
281
294
|
* FizzBuzz.is_fizz?(5) #=> false
|
282
295
|
* FizzBuzz.is_fizz?(15) #=> false
|
283
296
|
*
|
284
|
-
* Will raise a
|
297
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value is not
|
298
|
+
* an _Integer_ or _Bignum_ type.
|
285
299
|
*
|
286
300
|
* See also: FizzBuzz::[]
|
287
301
|
*/
|
@@ -289,7 +303,7 @@ VALUE
|
|
289
303
|
rb_fb_is_fizz(VALUE object, VALUE value)
|
290
304
|
{
|
291
305
|
UNUSED(object);
|
292
|
-
CHECK_TYPE(value,
|
306
|
+
CHECK_TYPE(value, error(E_INVALID_TYPE));
|
293
307
|
|
294
308
|
return CBOOL2RVAL(IS_FIZZ(value));
|
295
309
|
}
|
@@ -307,7 +321,8 @@ rb_fb_is_fizz(VALUE object, VALUE value)
|
|
307
321
|
* FizzBuzz.is_buzz?(5) #=> true
|
308
322
|
* FizzBuzz.is_buzz?(15) #=> false
|
309
323
|
*
|
310
|
-
* Will raise a
|
324
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value is not
|
325
|
+
* an _Integer_ or _Bignum_ type.
|
311
326
|
*
|
312
327
|
* See also: FizzBuzz::[]
|
313
328
|
*/
|
@@ -315,7 +330,7 @@ VALUE
|
|
315
330
|
rb_fb_is_buzz(VALUE object, VALUE value)
|
316
331
|
{
|
317
332
|
UNUSED(object);
|
318
|
-
CHECK_TYPE(value,
|
333
|
+
CHECK_TYPE(value, error(E_INVALID_TYPE));
|
319
334
|
|
320
335
|
return CBOOL2RVAL(IS_BUZZ(value));
|
321
336
|
}
|
@@ -333,7 +348,8 @@ rb_fb_is_buzz(VALUE object, VALUE value)
|
|
333
348
|
* FizzBuzz.is_fizzbuzz?(5) #=> false
|
334
349
|
* FizzBuzz.is_fizzbuzz?(15) #=> true
|
335
350
|
*
|
336
|
-
* Will raise a
|
351
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value is not
|
352
|
+
* an _Integer_ or _Bignum_ type.
|
337
353
|
*
|
338
354
|
* See also: FizzBuzz::[]
|
339
355
|
*/
|
@@ -341,7 +357,7 @@ VALUE
|
|
341
357
|
rb_fb_is_fizzbuzz(VALUE object, VALUE value)
|
342
358
|
{
|
343
359
|
UNUSED(object);
|
344
|
-
CHECK_TYPE(value,
|
360
|
+
CHECK_TYPE(value, error(E_INVALID_TYPE));
|
345
361
|
|
346
362
|
return CBOOL2RVAL(IS_FIZZBUZZ(value));
|
347
363
|
}
|
@@ -362,7 +378,8 @@ rb_fb_is_fizzbuzz(VALUE object, VALUE value)
|
|
362
378
|
* FizzBuzz[5] #=> "Buzz"
|
363
379
|
* FizzBuzz[15] #=> "FizzBuzz"
|
364
380
|
*
|
365
|
-
* Will raise a
|
381
|
+
* Will raise a <i>FizzBuzz::TypeError</i> exception if given value is not
|
382
|
+
* an _Integer_ or _Bignum_ type.
|
366
383
|
*
|
367
384
|
* See also: FizzBuzz::is_fizz?, FizzBuzz::is_buzz? and FizzBuzz::is_fizzbuzz?
|
368
385
|
*/
|
@@ -370,7 +387,7 @@ VALUE
|
|
370
387
|
rb_fb_square(VALUE object, VALUE value)
|
371
388
|
{
|
372
389
|
UNUSED(object);
|
373
|
-
CHECK_TYPE(value,
|
390
|
+
CHECK_TYPE(value, error(E_INVALID_TYPE));
|
374
391
|
|
375
392
|
return fizzbuzz_evaluate(value);
|
376
393
|
}
|
@@ -442,6 +459,60 @@ fizzbuzz_values(VALUE object, return_type_t type, direction_t direction)
|
|
442
459
|
return WANT_ARRAY(type) ? array : object;
|
443
460
|
}
|
444
461
|
|
462
|
+
VALUE
|
463
|
+
fizzbuzz_exception_wrapper(VALUE value)
|
464
|
+
{
|
465
|
+
exception_t *e = (struct exception *)value;
|
466
|
+
|
467
|
+
return rb_exc_new2(e->klass, e->message);
|
468
|
+
}
|
469
|
+
|
470
|
+
VALUE
|
471
|
+
fizzbuzz_exception(void *data)
|
472
|
+
{
|
473
|
+
int exception = 0;
|
474
|
+
VALUE object = Qnil;
|
475
|
+
|
476
|
+
exception_t *e = data;
|
477
|
+
|
478
|
+
object = rb_protect(fizzbuzz_exception_wrapper, (VALUE)e, &exception);
|
479
|
+
|
480
|
+
if (exception != 0) {
|
481
|
+
rb_jump_tag(exception);
|
482
|
+
}
|
483
|
+
|
484
|
+
rb_iv_set(object, "@start", e->start);
|
485
|
+
rb_iv_set(object, "@stop", e->stop);
|
486
|
+
|
487
|
+
return object;
|
488
|
+
}
|
489
|
+
|
490
|
+
VALUE
|
491
|
+
fizzbuzz_type_error(VALUE klass, const char *message)
|
492
|
+
{
|
493
|
+
exception_t e;
|
494
|
+
|
495
|
+
e.start = Qnil;
|
496
|
+
e.stop = Qnil;
|
497
|
+
e.message = message;
|
498
|
+
e.klass = klass;
|
499
|
+
|
500
|
+
return fizzbuzz_exception(&e);
|
501
|
+
}
|
502
|
+
|
503
|
+
VALUE
|
504
|
+
fizzbuzz_range_error(VALUE klass, VALUE start, VALUE stop, const char *message)
|
505
|
+
{
|
506
|
+
exception_t e;
|
507
|
+
|
508
|
+
e.start = start;
|
509
|
+
e.stop = stop;
|
510
|
+
e.message = message;
|
511
|
+
e.klass = klass;
|
512
|
+
|
513
|
+
return fizzbuzz_exception(&e);
|
514
|
+
}
|
515
|
+
|
445
516
|
void
|
446
517
|
Init_fizzbuzz(void)
|
447
518
|
{
|
@@ -449,9 +520,36 @@ Init_fizzbuzz(void)
|
|
449
520
|
id_at_stop = rb_intern("@stop");
|
450
521
|
|
451
522
|
rb_cFizzBuzz = rb_define_class("FizzBuzz", rb_cObject);
|
452
|
-
|
453
523
|
rb_include_module(rb_cFizzBuzz, rb_mEnumerable);
|
454
524
|
|
525
|
+
/*
|
526
|
+
* Raised when _FizzBuzz_ encounters an error.
|
527
|
+
*/
|
528
|
+
rb_fb_eError = rb_define_class_under(rb_cFizzBuzz, "Error", rb_eStandardError);
|
529
|
+
|
530
|
+
/*
|
531
|
+
* Stores current value of +start+ for which the exception might have been
|
532
|
+
* raised, or +nil+ otherwise.
|
533
|
+
*/
|
534
|
+
rb_define_attr(rb_fb_eError, "start", 1, 0);
|
535
|
+
|
536
|
+
/*
|
537
|
+
* Stores current value of +stop+ for which the exception might have been
|
538
|
+
* raised, or +nil+ otherwise.
|
539
|
+
*/
|
540
|
+
rb_define_attr(rb_fb_eError, "stop", 1, 0);
|
541
|
+
|
542
|
+
/*
|
543
|
+
* Raised when the arguments are wrong or of an incompatible type.
|
544
|
+
*/
|
545
|
+
rb_fb_eTypeError = rb_define_class_under(rb_cFizzBuzz, "TypeError", rb_fb_eError);
|
546
|
+
|
547
|
+
/*
|
548
|
+
* Raised when the arguments are wrong or given range from +start+ to +stop+
|
549
|
+
* is incorrect.
|
550
|
+
*/
|
551
|
+
rb_fb_eRangeError = rb_define_class_under(rb_cFizzBuzz, "RangeError", rb_fb_eError);
|
552
|
+
|
455
553
|
rb_define_method(rb_cFizzBuzz, "initialize", RUBY_METHOD_FUNC(rb_fb_initialize), -1);
|
456
554
|
|
457
555
|
rb_define_method(rb_cFizzBuzz, "start", RUBY_METHOD_FUNC(rb_fb_get_start), 0);
|
data/ext/fizzbuzz/fizzbuzz.h
CHANGED
@@ -66,18 +66,24 @@ extern "C" {
|
|
66
66
|
#define LOOP_FORWARD(x) ((x) == D_LOOP_FORWARD)
|
67
67
|
#define LOOP_REVERSE(x) ((x) == D_LOOP_REVERSE)
|
68
68
|
|
69
|
-
#define CHECK_TYPE(x, m)
|
70
|
-
do {
|
71
|
-
if (!INTEGER_P(x))
|
72
|
-
|
69
|
+
#define CHECK_TYPE(x, m) \
|
70
|
+
do { \
|
71
|
+
if (!INTEGER_P(x)) { \
|
72
|
+
VALUE __e_type = fizzbuzz_type_error(rb_fb_eTypeError, (m)); \
|
73
|
+
rb_exc_raise(__e_type); \
|
74
|
+
} \
|
73
75
|
} while (0)
|
74
76
|
|
75
|
-
#define
|
76
|
-
do {
|
77
|
-
if (GREATER(
|
78
|
-
|
77
|
+
#define CHECK_RANGE(x, y, m) \
|
78
|
+
do { \
|
79
|
+
if (GREATER(x, y)) { \
|
80
|
+
VALUE __e_range = fizzbuzz_range_error(rb_fb_eRangeError, (x), (y), (m)); \
|
81
|
+
rb_exc_raise(__e_range); \
|
82
|
+
} \
|
79
83
|
} while (0)
|
80
84
|
|
85
|
+
#define error(t) errors[(t)]
|
86
|
+
|
81
87
|
enum error {
|
82
88
|
E_INVALID_TYPE = 0,
|
83
89
|
E_INVALID_START_TYPE,
|
@@ -96,14 +102,21 @@ enum direction {
|
|
96
102
|
D_LOOP_REVERSE
|
97
103
|
};
|
98
104
|
|
99
|
-
|
105
|
+
struct exception {
|
106
|
+
VALUE start;
|
107
|
+
VALUE stop;
|
108
|
+
const char *message;
|
109
|
+
VALUE klass;
|
110
|
+
};
|
111
|
+
|
100
112
|
typedef enum return_type return_type_t;
|
101
113
|
typedef enum direction direction_t;
|
114
|
+
typedef struct exception exception_t;
|
102
115
|
|
103
116
|
static const char *errors[] = {
|
104
|
-
"must be an
|
105
|
-
"must be an
|
106
|
-
"must be an
|
117
|
+
"must be an Integer or Bignum type",
|
118
|
+
"must be an Integer or Bignum type for start",
|
119
|
+
"must be an Integer or Bignum type for stop",
|
107
120
|
"start value is higher than stop value",
|
108
121
|
"stop value is lower than start value",
|
109
122
|
NULL
|
@@ -205,8 +218,13 @@ fizzbuzz_less_equal(VALUE a, VALUE b)
|
|
205
218
|
}
|
206
219
|
|
207
220
|
RUBY_EXTERN ID id_at_start, id_at_stop;
|
221
|
+
|
208
222
|
RUBY_EXTERN VALUE rb_cFizzBuzz;
|
209
223
|
|
224
|
+
RUBY_EXTERN VALUE rb_fb_eError;
|
225
|
+
RUBY_EXTERN VALUE rb_fb_eTypeError;
|
226
|
+
RUBY_EXTERN VALUE rb_fb_eRangeError;
|
227
|
+
|
210
228
|
RUBY_EXTERN VALUE rb_fb_initialize(int argc, VALUE *argv, VALUE object);
|
211
229
|
|
212
230
|
RUBY_EXTERN VALUE rb_fb_get_start(VALUE object);
|
data/lib/fizzbuzz.rb
CHANGED
@@ -35,8 +35,8 @@ require 'fizzbuzz/bignum'
|
|
35
35
|
class FizzBuzz
|
36
36
|
#
|
37
37
|
# call-seq:
|
38
|
-
#
|
39
|
-
#
|
38
|
+
# FizzBuzz.fizzbuzz( start, stop, reverse ) -> array
|
39
|
+
# FizzBuzz.fizzbuzz( start, stop, reverse ) {|value| block } -> self
|
40
40
|
#
|
41
41
|
# Returns either an array or accepts a block if such is given. When a block is given
|
42
42
|
# then it will call the block once for each subsequent value for a given range from
|
@@ -48,30 +48,30 @@ class FizzBuzz
|
|
48
48
|
#
|
49
49
|
# Example:
|
50
50
|
#
|
51
|
-
#
|
52
|
-
#
|
51
|
+
# FizzBuzz.fizzbuzz(1, 15) #=> [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]
|
52
|
+
# FizzBuzz.fizzbuzz(1, 15, true) #=> ["FizzBuzz", 14, 13, "Fizz", 11, "Buzz", "Fizz", 8, 7, "Fizz", "Buzz", 4, "Fizz", 2, 1]
|
53
53
|
#
|
54
54
|
# Example:
|
55
55
|
#
|
56
|
-
#
|
56
|
+
# FizzBuzz.fizzbuzz(1, 15) {|value| puts "Got #{value}" }
|
57
57
|
#
|
58
58
|
# Produces:
|
59
59
|
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
60
|
+
# Got 1
|
61
|
+
# Got 2
|
62
|
+
# Got Fizz
|
63
|
+
# Got 4
|
64
|
+
# Got Buzz
|
65
|
+
# Got Fizz
|
66
|
+
# Got 7
|
67
|
+
# Got 8
|
68
|
+
# Got Fizz
|
69
|
+
# Got Buzz
|
70
|
+
# Got 11
|
71
|
+
# Got Fizz
|
72
|
+
# Got 13
|
73
|
+
# Got 14
|
74
|
+
# Got FizzBuzz
|
75
75
|
#
|
76
76
|
# See also: FizzBuzz::[], FizzBuzz::new, FizzBuzz#to_a, FizzBuzz#each and FizzBuzz#reverse_each
|
77
77
|
#
|
data/lib/fizzbuzz/bignum.rb
CHANGED
@@ -28,16 +28,16 @@
|
|
28
28
|
class Bignum
|
29
29
|
#
|
30
30
|
# call-seq:
|
31
|
-
#
|
31
|
+
# Bignum.fizz? -> true or false
|
32
32
|
#
|
33
33
|
# Returns +true+ if a given integer value is divisible by *three* (given
|
34
34
|
# value is a _Fizz_), or +false+ otherwise.
|
35
35
|
#
|
36
36
|
# Example:
|
37
37
|
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
38
|
+
# 1000000000000.fizz? #=> false
|
39
|
+
# 1000000000002.fizz? #=> true
|
40
|
+
# 1000000000005.fizz? #=> false
|
41
41
|
#
|
42
42
|
# See also: FizzBuzz::[] and FizzBuzz::is_fizz?
|
43
43
|
#
|
@@ -47,16 +47,16 @@ class Bignum
|
|
47
47
|
|
48
48
|
#
|
49
49
|
# call-seq:
|
50
|
-
#
|
50
|
+
# Bignum.buzz? -> true or false
|
51
51
|
#
|
52
52
|
# Returns +true+ if a given integer value is divisible by *five* (given
|
53
53
|
# value is a _Buzz_), or +false+ otherwise.
|
54
54
|
#
|
55
55
|
# Example:
|
56
56
|
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
57
|
+
# 1000000000000.buzz? #=> true
|
58
|
+
# 1000000000002.buzz? #=> false
|
59
|
+
# 1000000000005.buzz? #=> false
|
60
60
|
#
|
61
61
|
# See also: FizzBuzz::[] and FizzBuzz::is_buzz?
|
62
62
|
#
|
@@ -66,16 +66,16 @@ class Bignum
|
|
66
66
|
|
67
67
|
#
|
68
68
|
# call-seq:
|
69
|
-
#
|
69
|
+
# Bignum.fizzbuzz? -> true or false
|
70
70
|
#
|
71
71
|
# Returns +true+ if a given integer value is divisible by both *three*
|
72
72
|
# and *five* (given value is a _FizzBuzz_), or +false+ otherwise.
|
73
73
|
#
|
74
74
|
# Example:
|
75
75
|
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
76
|
+
# 1000000000000.fizzbuzz? #=> false
|
77
|
+
# 1000000000002.fizzbuzz? #=> false
|
78
|
+
# 1000000000005.fizzbuzz? #=> true
|
79
79
|
#
|
80
80
|
# See also: FizzBuzz::[] and FizzBuzz::is_fizzbuzz?
|
81
81
|
#
|
data/lib/fizzbuzz/integer.rb
CHANGED
@@ -28,16 +28,16 @@
|
|
28
28
|
class Integer
|
29
29
|
#
|
30
30
|
# call-seq:
|
31
|
-
#
|
31
|
+
# Integer.fizz? -> true or false
|
32
32
|
#
|
33
33
|
# Returns +true+ if a given integer value is divisible by *three* (given
|
34
34
|
# value is a _Fizz_), or +false+ otherwise.
|
35
35
|
#
|
36
36
|
# Example:
|
37
37
|
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
38
|
+
# 3.fizz? #=> true
|
39
|
+
# 5.fizz? #=> false
|
40
|
+
# 15.fizz? #=> false
|
41
41
|
#
|
42
42
|
# See also: FizzBuzz::[] and FizzBuzz::is_fizz?
|
43
43
|
#
|
@@ -47,16 +47,16 @@ class Integer
|
|
47
47
|
|
48
48
|
#
|
49
49
|
# call-seq:
|
50
|
-
#
|
50
|
+
# Integer.buzz? -> true or false
|
51
51
|
#
|
52
52
|
# Returns +true+ if a given integer value is divisible by *five* (given
|
53
53
|
# value is a _Buzz_), or +false+ otherwise.
|
54
54
|
#
|
55
55
|
# Example:
|
56
56
|
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
57
|
+
# 3.buzz? #=> false
|
58
|
+
# 5.buzz? #=> true
|
59
|
+
# 15.buzz? #=> false
|
60
60
|
#
|
61
61
|
# See also: FizzBuzz::[] and FizzBuzz::is_buzz?
|
62
62
|
#
|
@@ -73,9 +73,9 @@ class Integer
|
|
73
73
|
#
|
74
74
|
# Example:
|
75
75
|
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
76
|
+
# 3.fizzbuzz? #=> false
|
77
|
+
# 5.fizzbuzz? #=> false
|
78
|
+
# 15.fizzbuzz? #=> true
|
79
79
|
#
|
80
80
|
# See also: FizzBuzz::[] and FizzBuzz::is_fizzbuzz?
|
81
81
|
#
|
data/lib/fizzbuzz/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-fizzbuzz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -75,7 +75,17 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: 0.7.1
|
78
|
-
description: Yet another FizzBuzz in Ruby
|
78
|
+
description: ! 'Yet another FizzBuzz in Ruby
|
79
|
+
|
80
|
+
|
81
|
+
Provides simple and fast solution to a popular FizzBuzz problem for Ruby.
|
82
|
+
|
83
|
+
|
84
|
+
Written in C as an example of using Ruby''s C API - with the support for
|
85
|
+
|
86
|
+
arbitrary large numeric values via the Bignum class.
|
87
|
+
|
88
|
+
'
|
79
89
|
email: krzysztof.wilczynski@linux.com
|
80
90
|
executables:
|
81
91
|
- fizzbuzz
|
@@ -84,8 +94,8 @@ extensions:
|
|
84
94
|
extra_rdoc_files: []
|
85
95
|
files:
|
86
96
|
- ext/fizzbuzz/fizzbuzz.c
|
87
|
-
- ext/fizzbuzz/fizzbuzz.h
|
88
97
|
- ext/fizzbuzz/common.h
|
98
|
+
- ext/fizzbuzz/fizzbuzz.h
|
89
99
|
- ext/fizzbuzz/extconf.rb
|
90
100
|
- lib/fizzbuzz/bignum.rb
|
91
101
|
- lib/fizzbuzz/integer.rb
|
@@ -127,7 +137,5 @@ rubyforge_project: ruby-fizzbuzz
|
|
127
137
|
rubygems_version: 1.8.23
|
128
138
|
signing_key:
|
129
139
|
specification_version: 3
|
130
|
-
summary:
|
131
|
-
in C as an example of using Ruby's C API - with the support for arbitrary large
|
132
|
-
numeric values via the Bignum class.
|
140
|
+
summary: Yet another FizzBuzz in Ruby
|
133
141
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|