type_array 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +9 -0
- data/README.rdoc +0 -1
- data/bench/get_set.rb +19 -0
- data/bench/operators.rb +33 -0
- data/ext/type_array/type_array.c +80 -24
- data/ext/type_array/type_array.h +8 -3
- data/lib/type_array.rb +2 -1
- data/lib/type_array/marshal.rb +13 -0
- data/lib/type_array/version.rb +1 -1
- data/test/test_array_buffer.rb +11 -0
- data/test/test_data_view.rb +16 -0
- data/test/test_type_array.rb +47 -1
- metadata +8 -5
data/CHANGELOG.rdoc
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
= Changelog
|
2
2
|
|
3
|
+
== 0.3.0 (July 18th, 2012)
|
4
|
+
* Introduce support for setting operator results at a given offset without coercion to a Ruby object
|
5
|
+
* Let TypeArray be enumerable as well
|
6
|
+
* Support Marshal dump / load
|
7
|
+
|
8
|
+
== 0.2.0 (July 12th, 2012)
|
9
|
+
* Introduce support for lower level comparison at given offsets (avoids excess Ruby object allocations)
|
10
|
+
* Introduce support for lower level math operations at given offsets (avoids excess Ruby object allocations)
|
11
|
+
|
3
12
|
== 0.1.0 (July 11th, 2012)
|
4
13
|
* initial release
|
data/README.rdoc
CHANGED
data/bench/get_set.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('lib')
|
4
|
+
require 'type_array'
|
5
|
+
require 'benchmark'
|
6
|
+
|
7
|
+
typed = Float32Array.new(1_000_000)
|
8
|
+
native = Array.new(1_000_000)
|
9
|
+
|
10
|
+
|
11
|
+
Benchmark.bmbm do |x|
|
12
|
+
x.report("typed array []=") do
|
13
|
+
1_000_000.times {|i| typed[i] = 0.1234567890123456; typed[i] }
|
14
|
+
end
|
15
|
+
|
16
|
+
x.report("array []=") do
|
17
|
+
1_000_000.times {|i| native[i] = 0.1234567890123456; typed[i] }
|
18
|
+
end
|
19
|
+
end
|
data/bench/operators.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('lib')
|
4
|
+
require 'type_array'
|
5
|
+
require 'benchmark'
|
6
|
+
|
7
|
+
buf = ArrayBuffer.new(24)
|
8
|
+
|
9
|
+
typed = Float64Array.new(buf)
|
10
|
+
|
11
|
+
typed[0] = 2.33
|
12
|
+
typed[1] = 2.33
|
13
|
+
typed[2] = 7.45
|
14
|
+
native = [2.33, 2.33, 7.45]
|
15
|
+
|
16
|
+
|
17
|
+
Benchmark.bmbm do |x|
|
18
|
+
x.report("type array eql") do
|
19
|
+
1_000_000.times {|i| typed.eql(0,1) }
|
20
|
+
end
|
21
|
+
|
22
|
+
x.report("type array mul") do
|
23
|
+
1_000_000.times {|i| typed.mul(0,1) }
|
24
|
+
end
|
25
|
+
|
26
|
+
x.report("array eql") do
|
27
|
+
1_000_000.times {|i| native[0] == native[1] }
|
28
|
+
end
|
29
|
+
|
30
|
+
x.report("array mul") do
|
31
|
+
1_000_000.times {|i| native[0] * native[1] }
|
32
|
+
end
|
33
|
+
end
|
data/ext/type_array/type_array.c
CHANGED
@@ -237,7 +237,8 @@ DefineTypeArrayOperator(eql, ==, float64, double, (val == 0 ? Qfalse : Qtrue));
|
|
237
237
|
* Asserts type alignment.
|
238
238
|
*
|
239
239
|
*/
|
240
|
-
inline int rb_type_array_assert_alignment(unsigned long val, unsigned long bytes)
|
240
|
+
inline int rb_type_array_assert_alignment(unsigned long val, unsigned long bytes)
|
241
|
+
{
|
241
242
|
return (val & (bytes - 1)) == 0 ? 1 : 0;
|
242
243
|
}
|
243
244
|
|
@@ -246,7 +247,8 @@ inline int rb_type_array_assert_alignment(unsigned long val, unsigned long bytes
|
|
246
247
|
* Swizzles byte order.
|
247
248
|
*
|
248
249
|
*/
|
249
|
-
inline void rb_type_array_swizzle(char* buf, unsigned long len)
|
250
|
+
inline void rb_type_array_swizzle(char* buf, unsigned long len)
|
251
|
+
{
|
250
252
|
unsigned long i;
|
251
253
|
for (i = 0; i < len / 2; ++i) {
|
252
254
|
char t = buf[i];
|
@@ -257,14 +259,12 @@ inline void rb_type_array_swizzle(char* buf, unsigned long len) {
|
|
257
259
|
|
258
260
|
/*
|
259
261
|
* :nodoc:
|
260
|
-
* Validates offset boundaries
|
262
|
+
* Validates offset boundaries (no index coercion)
|
261
263
|
*
|
262
264
|
*/
|
263
|
-
static inline long
|
265
|
+
static inline long rb_type_array_assert_offset0(rb_type_array_t *ary, long idx)
|
264
266
|
{
|
265
|
-
long index;
|
266
|
-
Check_Type(idx, T_FIXNUM);
|
267
|
-
index = FIX2LONG(idx) * ary->size;
|
267
|
+
long index = idx * ary->size;
|
268
268
|
if (index < 0) rb_raise(rb_eRangeError, "Offset may not be negative.");
|
269
269
|
if (!rb_type_array_assert_alignment(index, ary->size)) rb_raise(rb_eRangeError, "Byte offset is not aligned.");
|
270
270
|
if ((unsigned long)index > ary->byte_length) rb_raise(rb_eRangeError, "Offset out of range.");
|
@@ -272,6 +272,17 @@ static inline long rb_type_array_assert_offset(rb_type_array_t *ary, VALUE idx)
|
|
272
272
|
return index;
|
273
273
|
}
|
274
274
|
|
275
|
+
/*
|
276
|
+
* :nodoc:
|
277
|
+
* Validates offset boundaries.
|
278
|
+
*
|
279
|
+
*/
|
280
|
+
static inline long rb_type_array_assert_offset(rb_type_array_t *ary, VALUE idx)
|
281
|
+
{
|
282
|
+
Check_Type(idx, T_FIXNUM);
|
283
|
+
return rb_type_array_assert_offset0(ary, FIX2LONG(idx));
|
284
|
+
}
|
285
|
+
|
275
286
|
/*
|
276
287
|
* :nodoc:
|
277
288
|
* GC mark callback
|
@@ -502,13 +513,16 @@ static VALUE rb_type_array_byte_length(VALUE obj)
|
|
502
513
|
* ary.mul(0,1) => 8
|
503
514
|
* ary.mul(1,2) => 32
|
504
515
|
*/
|
505
|
-
static VALUE rb_type_array_mul(
|
516
|
+
static VALUE rb_type_array_mul(int argc, VALUE *argv, VALUE obj)
|
506
517
|
{
|
518
|
+
VALUE off1, off2, off3;
|
507
519
|
GetTypeArray(obj);
|
508
520
|
GetArrayBuffer(ary->buf);
|
521
|
+
rb_scan_args(argc, argv, "21", &off1, &off2, &off3);
|
509
522
|
long offset1 = rb_type_array_assert_offset(ary, off1);
|
510
523
|
long offset2 = rb_type_array_assert_offset(ary, off2);
|
511
|
-
|
524
|
+
long offset3 = NIL_P(off3) ? 0 : rb_type_array_assert_offset(ary, off3);
|
525
|
+
return ary->mul_fn(buf->buf, offset1, offset2, offset3);
|
512
526
|
}
|
513
527
|
|
514
528
|
/*
|
@@ -527,13 +541,16 @@ static VALUE rb_type_array_mul(VALUE obj, VALUE off1, VALUE off2)
|
|
527
541
|
* ary.plus(0,1) => 6
|
528
542
|
* ary.plus(1,2) => 12
|
529
543
|
*/
|
530
|
-
static VALUE rb_type_array_plus(
|
544
|
+
static VALUE rb_type_array_plus(int argc, VALUE *argv, VALUE obj)
|
531
545
|
{
|
546
|
+
VALUE off1, off2, off3;
|
532
547
|
GetTypeArray(obj);
|
533
548
|
GetArrayBuffer(ary->buf);
|
549
|
+
rb_scan_args(argc, argv, "21", &off1, &off2, &off3);
|
534
550
|
long offset1 = rb_type_array_assert_offset(ary, off1);
|
535
551
|
long offset2 = rb_type_array_assert_offset(ary, off2);
|
536
|
-
|
552
|
+
long offset3 = NIL_P(off3) ? 0 : rb_type_array_assert_offset(ary, off3);
|
553
|
+
return ary->plus_fn(buf->buf, offset1, offset2, offset3);
|
537
554
|
}
|
538
555
|
|
539
556
|
/*
|
@@ -552,13 +569,16 @@ static VALUE rb_type_array_plus(VALUE obj, VALUE off1, VALUE off2)
|
|
552
569
|
* ary.minus(1, 0) => 2
|
553
570
|
* ary.minus(2, 1) => 4
|
554
571
|
*/
|
555
|
-
static VALUE rb_type_array_minus(
|
572
|
+
static VALUE rb_type_array_minus(int argc, VALUE *argv, VALUE obj)
|
556
573
|
{
|
574
|
+
VALUE off1, off2, off3;
|
557
575
|
GetTypeArray(obj);
|
558
576
|
GetArrayBuffer(ary->buf);
|
577
|
+
rb_scan_args(argc, argv, "21", &off1, &off2, &off3);
|
559
578
|
long offset1 = rb_type_array_assert_offset(ary, off1);
|
560
579
|
long offset2 = rb_type_array_assert_offset(ary, off2);
|
561
|
-
|
580
|
+
long offset3 = NIL_P(off3) ? 0 : rb_type_array_assert_offset(ary, off3);
|
581
|
+
return ary->minus_fn(buf->buf, offset1, offset2, offset3);
|
562
582
|
}
|
563
583
|
|
564
584
|
/*
|
@@ -577,20 +597,23 @@ static VALUE rb_type_array_minus(VALUE obj, VALUE off1, VALUE off2)
|
|
577
597
|
* ary.div(1, 0) => 2
|
578
598
|
* ary.div(2, 1) => 2
|
579
599
|
*/
|
580
|
-
static VALUE rb_type_array_div(
|
600
|
+
static VALUE rb_type_array_div(int argc, VALUE *argv, VALUE obj)
|
581
601
|
{
|
602
|
+
VALUE off1, off2, off3;
|
582
603
|
GetTypeArray(obj);
|
583
604
|
GetArrayBuffer(ary->buf);
|
605
|
+
rb_scan_args(argc, argv, "21", &off1, &off2, &off3);
|
584
606
|
long offset1 = rb_type_array_assert_offset(ary, off1);
|
585
607
|
long offset2 = rb_type_array_assert_offset(ary, off2);
|
586
|
-
|
608
|
+
long offset3 = NIL_P(off3) ? 0 : rb_type_array_assert_offset(ary, off3);
|
609
|
+
return ary->div_fn(buf->buf, offset1, offset2, offset3);
|
587
610
|
}
|
588
611
|
|
589
612
|
/*
|
590
613
|
* call-seq:
|
591
|
-
* ary.
|
614
|
+
* ary.eql(0,1) => true or fales
|
592
615
|
*
|
593
|
-
* Gets two values at given offsets and
|
616
|
+
* Gets two values at given offsets and compares them - a boolean's returned
|
594
617
|
*
|
595
618
|
* === Examples
|
596
619
|
* buf = ArrayBuffer.new(16) => ArrayBuffer
|
@@ -599,8 +622,8 @@ static VALUE rb_type_array_div(VALUE obj, VALUE off1, VALUE off2)
|
|
599
622
|
* ary[1] = 4 => nil
|
600
623
|
* ary[2] = 8 => nil
|
601
624
|
*
|
602
|
-
* ary.
|
603
|
-
* ary.
|
625
|
+
* ary.eql(1, 0) => false
|
626
|
+
* ary.eql(2, 2) => true
|
604
627
|
*/
|
605
628
|
static VALUE rb_type_array_eql(VALUE obj, VALUE off1, VALUE off2)
|
606
629
|
{
|
@@ -608,7 +631,7 @@ static VALUE rb_type_array_eql(VALUE obj, VALUE off1, VALUE off2)
|
|
608
631
|
GetArrayBuffer(ary->buf);
|
609
632
|
long offset1 = rb_type_array_assert_offset(ary, off1);
|
610
633
|
long offset2 = rb_type_array_assert_offset(ary, off2);
|
611
|
-
return ary->eql_fn(buf->buf, offset1, offset2);
|
634
|
+
return ary->eql_fn(buf->buf, offset1, offset2, 0);
|
612
635
|
}
|
613
636
|
|
614
637
|
/*
|
@@ -732,9 +755,41 @@ static VALUE rb_type_array_aget(VALUE obj, VALUE idx)
|
|
732
755
|
return ary->aref_fn(buf->buf, index);
|
733
756
|
}
|
734
757
|
|
758
|
+
/*
|
759
|
+
* call-seq:
|
760
|
+
* type_array.each {|item| block } => TypeArray
|
761
|
+
*
|
762
|
+
* Calls <i>block</i> once for each element in <i>self</i>, passing that element as a parameter.
|
763
|
+
*
|
764
|
+
* === Examples
|
765
|
+
* buf = ArrayBuffer.new(16) => ArrayBuffer
|
766
|
+
*
|
767
|
+
* ary = Int32Array.new(buf) => Int32Array
|
768
|
+
* ary[0] = 2 => nil
|
769
|
+
* ary[1] = 4 => nil
|
770
|
+
* ary[2] = 8 => nil
|
771
|
+
* ary[3] = 16 => nil
|
772
|
+
*
|
773
|
+
* ary.map(&:to_s) => %w(2 4 8 16)
|
774
|
+
*
|
775
|
+
*/
|
776
|
+
static VALUE rb_type_array_each(VALUE obj)
|
777
|
+
{
|
778
|
+
long index;
|
779
|
+
GetTypeArray(obj);
|
780
|
+
GetArrayBuffer(ary->buf);
|
781
|
+
|
782
|
+
RETURN_ENUMERATOR(obj, 0, 0);
|
783
|
+
for (index = 0; index < ary->length; index++) {
|
784
|
+
rb_yield(ary->aref_fn(buf->buf, (index * ary->size)));
|
785
|
+
}
|
786
|
+
return obj;
|
787
|
+
}
|
788
|
+
|
735
789
|
void _init_type_array()
|
736
790
|
{
|
737
791
|
rb_cTypeArray = rb_define_class("TypeArray", rb_cObject);
|
792
|
+
rb_include_module(rb_cTypeArray, rb_mEnumerable);
|
738
793
|
|
739
794
|
rb_type_array_intern_aget = rb_intern("[]");
|
740
795
|
rb_type_array_intern_aset = rb_intern("[]=");
|
@@ -766,9 +821,10 @@ void _init_type_array()
|
|
766
821
|
rb_define_method(rb_cTypeArray, "to_s", rb_type_array_to_s, 0);
|
767
822
|
rb_define_method(rb_cTypeArray, "[]=", rb_type_array_aset, 2);
|
768
823
|
rb_define_method(rb_cTypeArray, "[]", rb_type_array_aget, 1);
|
769
|
-
rb_define_method(rb_cTypeArray, "mul", rb_type_array_mul,
|
770
|
-
rb_define_method(rb_cTypeArray, "plus", rb_type_array_plus,
|
771
|
-
rb_define_method(rb_cTypeArray, "minus", rb_type_array_minus,
|
772
|
-
rb_define_method(rb_cTypeArray, "div", rb_type_array_div,
|
824
|
+
rb_define_method(rb_cTypeArray, "mul", rb_type_array_mul, -1);
|
825
|
+
rb_define_method(rb_cTypeArray, "plus", rb_type_array_plus, -1);
|
826
|
+
rb_define_method(rb_cTypeArray, "minus", rb_type_array_minus, -1);
|
827
|
+
rb_define_method(rb_cTypeArray, "div", rb_type_array_div, -1);
|
773
828
|
rb_define_method(rb_cTypeArray, "eql", rb_type_array_eql, 2);
|
829
|
+
rb_define_method(rb_cTypeArray, "each", rb_type_array_each, 0);
|
774
830
|
}
|
data/ext/type_array/type_array.h
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
typedef void (type_array_aset_fn) (rb_array_buffer_t *buf, long index, VALUE item);
|
5
5
|
typedef VALUE (type_array_aref_fn) (rb_array_buffer_t *buf, long index);
|
6
|
-
typedef VALUE (type_array_operator_fn) (rb_array_buffer_t *buf, long off1, long off2);
|
6
|
+
typedef VALUE (type_array_operator_fn) (rb_array_buffer_t *buf, long off1, long off2, long off3);
|
7
7
|
|
8
8
|
typedef struct {
|
9
9
|
unsigned long size;
|
@@ -48,13 +48,18 @@ void _init_type_array();
|
|
48
48
|
DefineTypeArrayOperator(div, /, name, type, coercion); \
|
49
49
|
|
50
50
|
#define DefineTypeArrayOperator(op_name, op, name, type, coercion) \
|
51
|
-
VALUE rb_type_array_##op_name##_##name(rb_array_buffer_t *buf, long off1, long off2) \
|
51
|
+
VALUE rb_type_array_##op_name##_##name(rb_array_buffer_t *buf, long off1, long off2, long off3) \
|
52
52
|
{ \
|
53
53
|
type val; \
|
54
54
|
type val1 = rb_type_array_get_##name(buf, off1, TYPE_ARRAY_IS_LITTLE_ENDIAN); \
|
55
55
|
type val2 = rb_type_array_get_##name(buf, off2, TYPE_ARRAY_IS_LITTLE_ENDIAN); \
|
56
56
|
val = val1 op val2; \
|
57
|
-
|
57
|
+
if (off3 != 0) { \
|
58
|
+
rb_type_array_set_##name(buf, off3, val, TYPE_ARRAY_IS_LITTLE_ENDIAN); \
|
59
|
+
return Qnil; \
|
60
|
+
} else { \
|
61
|
+
return coercion; \
|
62
|
+
} \
|
58
63
|
}
|
59
64
|
|
60
65
|
#endif
|
data/lib/type_array.rb
CHANGED
@@ -7,8 +7,9 @@ require "type_array_ext"
|
|
7
7
|
|
8
8
|
require 'type_array/version' unless defined? TypeArray::VERSION
|
9
9
|
require 'type_array/io'
|
10
|
+
require 'type_array/marshal'
|
10
11
|
|
11
12
|
[ArrayBuffer, TypeArray, DataView].each do |c|
|
12
13
|
c.extend TypeArray::IOReader
|
13
|
-
c.send(:include, TypeArray::IOWriter)
|
14
|
+
c.send(:include, TypeArray::IOWriter, TypeArray::Marshal)
|
14
15
|
end
|
data/lib/type_array/version.rb
CHANGED
data/test/test_array_buffer.rb
CHANGED
@@ -66,6 +66,17 @@ class TestArrayBuffer < TypeArrayTestCase
|
|
66
66
|
assert str.frozen?
|
67
67
|
end
|
68
68
|
|
69
|
+
def test_marshal
|
70
|
+
buf = ArrayBuffer.new(4)
|
71
|
+
assert_equal "\x00\x00\x00\x00", buf.to_s
|
72
|
+
|
73
|
+
serialized = "\x04\bu:\x10ArrayBuffer\t\x00\x00\x00\x00"
|
74
|
+
assert_equal serialized, Marshal.dump(buf)
|
75
|
+
|
76
|
+
buf = Marshal.load(serialized)
|
77
|
+
assert_equal "\x00\x00\x00\x00", buf.to_s
|
78
|
+
end
|
79
|
+
|
69
80
|
def test_io
|
70
81
|
buf = ArrayBuffer.new(16)
|
71
82
|
|
data/test/test_data_view.rb
CHANGED
@@ -69,6 +69,22 @@ class TestDataView < TypeArrayTestCase
|
|
69
69
|
assert str.frozen?
|
70
70
|
end
|
71
71
|
|
72
|
+
def test_marshal
|
73
|
+
buf = ArrayBuffer.new(4)
|
74
|
+
|
75
|
+
view = DataView.new(buf)
|
76
|
+
view.set_int8(1, 5)
|
77
|
+
view.set_int16(3, 7)
|
78
|
+
|
79
|
+
serialized = "\x04\bu:\rDataView\t\x00\x05\x00\a"
|
80
|
+
assert_equal serialized, Marshal.dump(view)
|
81
|
+
|
82
|
+
view = Marshal.load(serialized)
|
83
|
+
assert_instance_of DataView, view
|
84
|
+
assert_equal 5, view.get_int8(1)
|
85
|
+
assert_equal 7, view.get_int8(3)
|
86
|
+
end
|
87
|
+
|
72
88
|
def test_int8
|
73
89
|
buf = ArrayBuffer.new(100)
|
74
90
|
|
data/test/test_type_array.rb
CHANGED
@@ -89,7 +89,7 @@ class TestTypeArray < TypeArrayTestCase
|
|
89
89
|
|
90
90
|
ary2 = Int8Array.new(ary)
|
91
91
|
assert_equal 100, ary2[0]
|
92
|
-
assert_equal
|
92
|
+
assert_equal(-56, ary2[1])
|
93
93
|
assert_equal 44, ary2[2]
|
94
94
|
end
|
95
95
|
|
@@ -163,6 +163,9 @@ class TestTypeArray < TypeArrayTestCase
|
|
163
163
|
|
164
164
|
assert_equal 8, ary.mul(0,1)
|
165
165
|
assert_equal 32, ary.mul(1, 2)
|
166
|
+
|
167
|
+
ary.mul(0, 1, 3)
|
168
|
+
assert_equal 8, ary[3]
|
166
169
|
end
|
167
170
|
|
168
171
|
def test_plus
|
@@ -175,6 +178,9 @@ class TestTypeArray < TypeArrayTestCase
|
|
175
178
|
|
176
179
|
assert_equal 6, ary.plus(0,1)
|
177
180
|
assert_equal 12, ary.plus(1, 2)
|
181
|
+
|
182
|
+
ary.plus(1, 2, 3)
|
183
|
+
assert_equal 12, ary[3]
|
178
184
|
end
|
179
185
|
|
180
186
|
def test_minus
|
@@ -187,6 +193,9 @@ class TestTypeArray < TypeArrayTestCase
|
|
187
193
|
|
188
194
|
assert_equal 2, ary.minus(1,0)
|
189
195
|
assert_equal 4, ary.minus(2, 1)
|
196
|
+
|
197
|
+
ary.minus(2, 1, 3)
|
198
|
+
assert_equal 4, ary[3]
|
190
199
|
end
|
191
200
|
|
192
201
|
def test_div
|
@@ -199,6 +208,9 @@ class TestTypeArray < TypeArrayTestCase
|
|
199
208
|
|
200
209
|
assert_equal 2, ary.div(1,0)
|
201
210
|
assert_equal 2, ary.div(2, 1)
|
211
|
+
|
212
|
+
ary.div(2, 1, 3)
|
213
|
+
assert_equal 2, ary[3]
|
202
214
|
end
|
203
215
|
|
204
216
|
def test_eql
|
@@ -225,4 +237,38 @@ class TestTypeArray < TypeArrayTestCase
|
|
225
237
|
assert ary.eql(0,1)
|
226
238
|
assert !ary.eql(1,2)
|
227
239
|
end
|
240
|
+
|
241
|
+
def test_each
|
242
|
+
buf = ArrayBuffer.new(16)
|
243
|
+
|
244
|
+
ary = Int32Array.new(buf)
|
245
|
+
ary[0] = 2
|
246
|
+
ary[1] = 4
|
247
|
+
ary[2] = 8
|
248
|
+
ary[3] = 16
|
249
|
+
|
250
|
+
vals = []
|
251
|
+
assert_equal ary, ary.each{|v| vals << v }
|
252
|
+
|
253
|
+
assert_equal [2, 4, 8, 16], vals
|
254
|
+
assert_equal %w(2 4 8 16), ary.map(&:to_s)
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_marshal
|
258
|
+
buf = ArrayBuffer.new(16)
|
259
|
+
|
260
|
+
ary = Int32Array.new(buf)
|
261
|
+
ary[0] = 2
|
262
|
+
ary[1] = 4
|
263
|
+
ary[2] = 8
|
264
|
+
ary[3] = 16
|
265
|
+
|
266
|
+
serialized = "\x04\bu:\x0FInt32Array\x15\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\b\x00\x00\x00\x10"
|
267
|
+
assert_equal serialized, Marshal.dump(ary)
|
268
|
+
|
269
|
+
ary = Marshal.load(serialized)
|
270
|
+
assert_instance_of Int32Array, ary
|
271
|
+
assert_equal 2, ary[0]
|
272
|
+
assert_equal 16, ary[3]
|
273
|
+
end
|
228
274
|
end
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: type_array
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 3
|
9
|
+
version: "0.3"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- "Lourens Naud\xC3\xA9"
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-07-
|
17
|
+
date: 2012-07-18 00:00:00 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: rake-compiler
|
@@ -49,6 +49,8 @@ files:
|
|
49
49
|
- Gemfile.lock
|
50
50
|
- README.rdoc
|
51
51
|
- Rakefile
|
52
|
+
- bench/get_set.rb
|
53
|
+
- bench/operators.rb
|
52
54
|
- ext/type_array/array_buffer.c
|
53
55
|
- ext/type_array/array_buffer.h
|
54
56
|
- ext/type_array/data_view.c
|
@@ -65,6 +67,7 @@ files:
|
|
65
67
|
- ext/type_array/type_array_ext.h
|
66
68
|
- lib/type_array.rb
|
67
69
|
- lib/type_array/io.rb
|
70
|
+
- lib/type_array/marshal.rb
|
68
71
|
- lib/type_array/version.rb
|
69
72
|
- test/helper.rb
|
70
73
|
- test/test_array_buffer.rb
|
@@ -108,7 +111,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
111
|
requirements: []
|
109
112
|
|
110
113
|
rubyforge_project:
|
111
|
-
rubygems_version: 1.8.
|
114
|
+
rubygems_version: 1.8.23
|
112
115
|
signing_key:
|
113
116
|
specification_version: 3
|
114
117
|
summary: Typed Arrays for Ruby
|