rucy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/src/value.cpp ADDED
@@ -0,0 +1,511 @@
1
+ // -*- c++ -*-
2
+ #include "rucy/value.h"
3
+
4
+
5
+ #include <rucy/rucy.h>
6
+ #include <rucy/function.h>
7
+ #include <rucy/exception.h>
8
+
9
+
10
+ namespace Rucy
11
+ {
12
+
13
+
14
+ Value::Value ()
15
+ : v(Qnil)
16
+ {
17
+ }
18
+
19
+ Value::Value (bool b)
20
+ : v(b ? Qtrue : Qfalse)
21
+ {
22
+ }
23
+
24
+ Value::Value (int n)
25
+ : v(INT2FIX(n))
26
+ {
27
+ }
28
+
29
+ Value::Value (float f)
30
+ : v(rb_float_new(f))
31
+ {
32
+ }
33
+
34
+ Value::Value (double d)
35
+ : v(rb_float_new(d))
36
+ {
37
+ }
38
+
39
+ Value::Value (const char* s, bool tainted)
40
+ : v(tainted ? rb_tainted_str_new2(s) : rb_str_new2(s))
41
+ {
42
+ }
43
+
44
+ Value::Value (const char* s, size_t len, bool tainted)
45
+ : v(tainted ? rb_tainted_str_new(s, len) : rb_str_new(s, len))
46
+ {
47
+ }
48
+
49
+ Value::Value (size_t size, const Value* values)
50
+ : v(size > 0 ? rb_ary_new2(size) : rb_ary_new())
51
+ {
52
+ if (!values) return;
53
+ for (size_t i = 0; i < size; ++i)
54
+ push(values[i]);
55
+ }
56
+
57
+ Value::Value (VALUE v)
58
+ : v(v)
59
+ {
60
+ }
61
+
62
+ VALUE
63
+ Value::value () const
64
+ {
65
+ return v;
66
+ }
67
+
68
+ void
69
+ Value::mark () const
70
+ {
71
+ rb_gc_mark(v);
72
+ }
73
+
74
+ int
75
+ Value::type () const
76
+ {
77
+ return TYPE(v);
78
+ }
79
+
80
+ Value
81
+ Value::klass () const
82
+ {
83
+ return RBASIC(v)->klass;
84
+ }
85
+
86
+ bool
87
+ Value::is_kind_of (Value klass) const
88
+ {
89
+ SYM_Q(kind_of);
90
+ return call(kind_of, klass);
91
+ }
92
+
93
+ static int
94
+ get_object_size (Value obj, Symbol method)
95
+ {
96
+ if (obj.type() == T_STRING)
97
+ return RSTRING_LEN(obj.value());
98
+ else if (obj.type() == T_ARRAY)
99
+ return RARRAY_LEN(obj.value());
100
+ else
101
+ return obj.call(method);
102
+ }
103
+
104
+ int
105
+ Value::size () const
106
+ {
107
+ SYM(size);
108
+ return get_object_size(v, size);
109
+ }
110
+
111
+ int
112
+ Value::length () const
113
+ {
114
+ SYM(length);
115
+ return get_object_size(v, length);
116
+ }
117
+
118
+ Value
119
+ Value::to_i () const
120
+ {
121
+ if (FIXNUM_P(v) || TYPE(v) == T_BIGNUM) return *this;
122
+ SYM(to_i);
123
+ return call(to_i);
124
+ }
125
+
126
+ Value
127
+ Value::to_f () const
128
+ {
129
+ if (TYPE(v) == T_FLOAT) return *this;
130
+ SYM(to_f);
131
+ return call(to_f);
132
+ }
133
+
134
+ Value
135
+ Value::to_s () const
136
+ {
137
+ if (TYPE(v) == T_STRING) return *this;
138
+ SYM(to_s);
139
+ return call(to_s);
140
+ }
141
+
142
+ Value
143
+ Value::to_sym () const
144
+ {
145
+ if (TYPE(v) == T_SYMBOL) return *this;
146
+ SYM(to_sym);
147
+ return call(to_sym);
148
+ }
149
+
150
+ bool
151
+ Value::is_i () const
152
+ {
153
+ return is_kind_of(rb_cFixnum);
154
+ }
155
+
156
+ bool
157
+ Value::is_f () const
158
+ {
159
+ return is_kind_of(rb_cFloat);
160
+ }
161
+
162
+ bool
163
+ Value::is_s () const
164
+ {
165
+ return is_kind_of(rb_cString);
166
+ }
167
+
168
+ bool
169
+ Value::is_sym () const
170
+ {
171
+ return is_kind_of(rb_cSymbol);
172
+ }
173
+
174
+ bool
175
+ Value::is_a () const
176
+ {
177
+ return is_kind_of(rb_cArray);
178
+ }
179
+
180
+ int
181
+ Value::as_i (bool convert) const
182
+ {
183
+ return to<int>(*this, convert);
184
+ }
185
+
186
+ double
187
+ Value::as_f (bool convert) const
188
+ {
189
+ return to<double>(*this, convert);
190
+ }
191
+
192
+ const char*
193
+ Value::as_s (bool convert) const
194
+ {
195
+ return to<const char*>(*this, convert);
196
+ }
197
+
198
+ Symbol
199
+ Value::as_sym (bool convert) const
200
+ {
201
+ return to<Symbol>(*this, convert);
202
+ }
203
+
204
+ Value
205
+ Value::call (Symbol name, int argc, const Value* argv) const
206
+ {
207
+ return protect(rb_funcall2, value(), name.id(), argc, (const VALUE*) argv);
208
+ }
209
+ Value
210
+ Value::call (Symbol name) const
211
+ {
212
+ const VALUE args[] = {};
213
+ return protect(rb_funcall2, value(), name.id(), 0, args);
214
+ }
215
+ Value
216
+ Value::call (Symbol name, Value v1) const
217
+ {
218
+ const VALUE args[] = {v1};
219
+ return protect(rb_funcall2, value(), name.id(), 1, args);
220
+ }
221
+ Value
222
+ Value::call (Symbol name, Value v1, Value v2) const
223
+ {
224
+ const VALUE args[] = {v1, v2};
225
+ return protect(rb_funcall2, value(), name.id(), 2, args);
226
+ }
227
+ Value
228
+ Value::call (Symbol name, Value v1, Value v2, Value v3) const
229
+ {
230
+ const VALUE args[] = {v1, v2, v3};
231
+ return protect(rb_funcall2, value(), name.id(), 3, args);
232
+ }
233
+ Value
234
+ Value::call (Symbol name, Value v1, Value v2, Value v3, Value v4) const
235
+ {
236
+ const VALUE args[] = {v1, v2, v3, v4};
237
+ return protect(rb_funcall2, value(), name.id(), 4, args);
238
+ }
239
+ Value
240
+ Value::call (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5) const
241
+ {
242
+ const VALUE args[] = {v1, v2, v3, v4, v5};
243
+ return protect(rb_funcall2, value(), name.id(), 5, args);
244
+ }
245
+ Value
246
+ Value::call (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6) const
247
+ {
248
+ const VALUE args[] = {v1, v2, v3, v4, v5, v6};
249
+ return protect(rb_funcall2, value(), name.id(), 6, args);
250
+ }
251
+ Value
252
+ Value::call (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7) const
253
+ {
254
+ const VALUE args[] = {v1, v2, v3, v4, v5, v6, v7};
255
+ return protect(rb_funcall2, value(), name.id(), 7, args);
256
+ }
257
+ Value
258
+ Value::call (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7, Value v8) const
259
+ {
260
+ const VALUE args[] = {v1, v2, v3, v4, v5, v6, v7, v8};
261
+ return protect(rb_funcall2, value(), name.id(), 8, args);
262
+ }
263
+ Value
264
+ Value::operator () (Symbol name, int argc, const Value* argv) const
265
+ {
266
+ return protect(rb_funcall2, value(), name.id(), argc, (const VALUE*) argv);
267
+ }
268
+ Value
269
+ Value::operator () (Symbol name) const
270
+ {
271
+ const VALUE args[] = {};
272
+ return protect(rb_funcall2, value(), name.id(), 0, args);
273
+ }
274
+ Value
275
+ Value::operator () (Symbol name, Value v1) const
276
+ {
277
+ const VALUE args[] = {v1};
278
+ return protect(rb_funcall2, value(), name.id(), 1, args);
279
+ }
280
+ Value
281
+ Value::operator () (Symbol name, Value v1, Value v2) const
282
+ {
283
+ const VALUE args[] = {v1, v2};
284
+ return protect(rb_funcall2, value(), name.id(), 2, args);
285
+ }
286
+ Value
287
+ Value::operator () (Symbol name, Value v1, Value v2, Value v3) const
288
+ {
289
+ const VALUE args[] = {v1, v2, v3};
290
+ return protect(rb_funcall2, value(), name.id(), 3, args);
291
+ }
292
+ Value
293
+ Value::operator () (Symbol name, Value v1, Value v2, Value v3, Value v4) const
294
+ {
295
+ const VALUE args[] = {v1, v2, v3, v4};
296
+ return protect(rb_funcall2, value(), name.id(), 4, args);
297
+ }
298
+ Value
299
+ Value::operator () (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5) const
300
+ {
301
+ const VALUE args[] = {v1, v2, v3, v4, v5};
302
+ return protect(rb_funcall2, value(), name.id(), 5, args);
303
+ }
304
+ Value
305
+ Value::operator () (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6) const
306
+ {
307
+ const VALUE args[] = {v1, v2, v3, v4, v5, v6};
308
+ return protect(rb_funcall2, value(), name.id(), 6, args);
309
+ }
310
+ Value
311
+ Value::operator () (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7) const
312
+ {
313
+ const VALUE args[] = {v1, v2, v3, v4, v5, v6, v7};
314
+ return protect(rb_funcall2, value(), name.id(), 7, args);
315
+ }
316
+ Value
317
+ Value::operator () (Symbol name, Value v1, Value v2, Value v3, Value v4, Value v5, Value v6, Value v7, Value v8) const
318
+ {
319
+ const VALUE args[] = {v1, v2, v3, v4, v5, v6, v7, v8};
320
+ return protect(rb_funcall2, value(), name.id(), 8, args);
321
+ }
322
+
323
+ Value
324
+ Value::inspect () const
325
+ {
326
+ SYM(inspect);
327
+ return call(inspect);
328
+ }
329
+
330
+ const char*
331
+ Value::c_str () const
332
+ {
333
+ return value_to<const char*>(*this);
334
+ }
335
+
336
+ Value&
337
+ Value::operator [] (int i)
338
+ {
339
+ if (type() != T_ARRAY) type_error();
340
+ return *(Value*) &RARRAY_PTR(v)[i];
341
+ }
342
+
343
+ const Value&
344
+ Value::operator [] (int i) const
345
+ {
346
+ return const_cast<Value*>(this)->operator[](i);
347
+ }
348
+
349
+ Value::operator VALUE () const
350
+ {
351
+ return value();
352
+ }
353
+
354
+ static bool
355
+ test_value (VALUE v)
356
+ {
357
+ return !NIL_P(v) && v != Qfalse;// RTEST(v);
358
+ }
359
+
360
+ Value::operator bool () const
361
+ {
362
+ return test_value(v);
363
+ }
364
+
365
+ bool
366
+ Value::operator ! () const
367
+ {
368
+ return !operator bool();
369
+ }
370
+
371
+ bool
372
+ Value::operator == (const Value& rhs) const
373
+ {
374
+ return v == rhs.v;// test_value(rb_obj_equal(v, rhs.v);
375
+ }
376
+
377
+ bool
378
+ Value::operator != (const Value& rhs) const
379
+ {
380
+ return !operator==(rhs);
381
+ }
382
+
383
+ Value
384
+ Value::push (Value obj)
385
+ {
386
+ return rb_ary_push(value(), obj.value());
387
+ }
388
+
389
+ Value
390
+ Value::pop ()
391
+ {
392
+ return rb_ary_pop(value());
393
+ }
394
+
395
+ Value
396
+ Value::shift ()
397
+ {
398
+ return rb_ary_shift(value());
399
+ }
400
+
401
+ Value
402
+ Value::unshift (Value obj)
403
+ {
404
+ return rb_ary_unshift(value(), obj.value());
405
+ }
406
+
407
+
408
+ Value
409
+ value (bool b)
410
+ {
411
+ return b;
412
+ }
413
+
414
+ Value
415
+ value (char n)
416
+ {
417
+ return (int) n;
418
+ }
419
+
420
+ Value
421
+ value (unsigned char n)
422
+ {
423
+ return (int) n;
424
+ }
425
+
426
+ Value
427
+ value (short n)
428
+ {
429
+ return (int) n;
430
+ }
431
+
432
+ Value
433
+ value (unsigned short n)
434
+ {
435
+ return (int) n;
436
+ }
437
+
438
+ Value
439
+ value (int n)
440
+ {
441
+ return n;
442
+ }
443
+
444
+ Value
445
+ value (unsigned int n)
446
+ {
447
+ return UINT2NUM(n);
448
+ }
449
+
450
+ Value
451
+ value (long n)
452
+ {
453
+ return LONG2NUM(n);
454
+ }
455
+
456
+ Value
457
+ value (unsigned long n)
458
+ {
459
+ return ULONG2NUM(n);
460
+ }
461
+
462
+ Value
463
+ value (long long n)
464
+ {
465
+ return LL2NUM(n);
466
+ }
467
+
468
+ Value
469
+ value (unsigned long long n)
470
+ {
471
+ return ULL2NUM(n);
472
+ }
473
+
474
+ Value
475
+ value (float f)
476
+ {
477
+ return f;
478
+ }
479
+
480
+ Value
481
+ value (double d)
482
+ {
483
+ return d;
484
+ }
485
+
486
+ Value
487
+ value (const char* s, bool tainted)
488
+ {
489
+ return Value(s, tainted);
490
+ }
491
+
492
+ Value
493
+ value (const char* s, size_t len, bool tainted)
494
+ {
495
+ return Value(s, len, tainted);
496
+ }
497
+
498
+ Value
499
+ value (size_t size, const Value* values)
500
+ {
501
+ return Value(size, values);
502
+ }
503
+
504
+ Value
505
+ value (Symbol sym)
506
+ {
507
+ return ID2SYM(sym.id());
508
+ }
509
+
510
+
511
+ }// Rucy