multiarray 0.2.0
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/COPYING +679 -0
- data/Makefile +73 -0
- data/README +1 -0
- data/lib/multiarray.rb +39 -0
- data/lib/multiarray/composite_type.rb +34 -0
- data/lib/multiarray/descriptortype.rb +19 -0
- data/lib/multiarray/int.rb +97 -0
- data/lib/multiarray/list.rb +48 -0
- data/lib/multiarray/memory.rb +45 -0
- data/lib/multiarray/multiarray.rb +13 -0
- data/lib/multiarray/sequence.rb +139 -0
- data/lib/multiarray/sequence_operation.rb +17 -0
- data/lib/multiarray/storage.rb +13 -0
- data/lib/multiarray/type.rb +108 -0
- data/lib/multiarray/type_operation.rb +12 -0
- data/source.gemspec +23 -0
- data/test/tc_int.rb +116 -0
- data/test/tc_sequence.rb +126 -0
- data/test/ts_multiarray.rb +4 -0
- metadata +85 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module Hornetseye
|
2
|
+
|
3
|
+
module SequenceOperation
|
4
|
+
|
5
|
+
def op( *args, &action )
|
6
|
+
for i in 0 ... num_elements
|
7
|
+
sub_args = args.collect do |arg|
|
8
|
+
arg.is_a?( Sequence_ ) ? arg[ i ] : arg
|
9
|
+
end
|
10
|
+
sel( i ).op *sub_args, &action
|
11
|
+
end
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module Hornetseye
|
2
|
+
|
3
|
+
class Type
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def alloc
|
8
|
+
memory.alloc bytesize
|
9
|
+
end
|
10
|
+
|
11
|
+
def typecode
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
def basetype
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def empty?
|
20
|
+
size == 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def shape
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
|
27
|
+
def size
|
28
|
+
shape.inject( 1 ) { |a,b| a * b }
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_accessor :memory
|
34
|
+
|
35
|
+
def bytesize
|
36
|
+
self.class.bytesize
|
37
|
+
end
|
38
|
+
|
39
|
+
def typecode
|
40
|
+
self.class.typecode
|
41
|
+
end
|
42
|
+
|
43
|
+
def basetype
|
44
|
+
self.class.basetype
|
45
|
+
end
|
46
|
+
|
47
|
+
def empty?
|
48
|
+
self.class.empty?
|
49
|
+
end
|
50
|
+
|
51
|
+
def shape
|
52
|
+
self.class.shape
|
53
|
+
end
|
54
|
+
|
55
|
+
def size
|
56
|
+
self.class.size
|
57
|
+
end
|
58
|
+
|
59
|
+
def initialize( *args )
|
60
|
+
options = args.last.is_a?( Hash ) ? args.pop : {}
|
61
|
+
raise ArgumentError.new( 'Too many arguments' ) unless args.size <= 1
|
62
|
+
value = args.empty? ? nil : args.first
|
63
|
+
@memory = options[ :memory ] ? options[ :memory ] : self.class.alloc
|
64
|
+
set value unless value.nil?
|
65
|
+
end
|
66
|
+
|
67
|
+
def inspect
|
68
|
+
"#{self.class.inspect}(#{to_s})"
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_s
|
72
|
+
get.to_s
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_a
|
76
|
+
get.to_a
|
77
|
+
end
|
78
|
+
|
79
|
+
def set( value = typecode.default )
|
80
|
+
@memory.store self.class, value
|
81
|
+
value
|
82
|
+
end
|
83
|
+
|
84
|
+
def get
|
85
|
+
@memory.load self.class
|
86
|
+
end
|
87
|
+
|
88
|
+
def sel
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def at( *indices )
|
93
|
+
sel( *indices ).get
|
94
|
+
end
|
95
|
+
|
96
|
+
alias_method :[], :at
|
97
|
+
|
98
|
+
def assign( *args )
|
99
|
+
sel( *args[ 0 ... -1 ] ).set args.last
|
100
|
+
end
|
101
|
+
|
102
|
+
alias_method :[]=, :assign
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
Type.class_eval { include TypeOperation }
|
107
|
+
|
108
|
+
end
|
data/source.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'date'
|
2
|
+
Gem::Specification.new do |s|
|
3
|
+
s.name = %q{multiarray}
|
4
|
+
s.version = '0.2.0'
|
5
|
+
s.platform = Gem::Platform::RUBY
|
6
|
+
s.date = Date.today.to_s
|
7
|
+
s.summary = %q{Multi-dimensional and uniform Ruby arrays}
|
8
|
+
s.description = %q{This Ruby-extension defines Hornetseye::MultiArray and other native datatypes. Hornetseye::MultiArray provides multi-dimensional Ruby arrays with elements of same type. The extension is designed to be mostly compatible with Masahiro Tanaka's NArray. However it allows the definition of custom element types and operations on them. This work was also inspired by Ronald Garcia's boost::multi_array and by Todd Veldhuizen's Blitz++.}
|
9
|
+
s.author = %q{Jan Wedekind}
|
10
|
+
s.email = %q{jan@wedesoft.de}
|
11
|
+
s.homepage = %q{http://wedesoft.github.com/multiarray/}
|
12
|
+
s.files = [ 'source.gemspec', 'Makefile', 'README', 'COPYING' ] +
|
13
|
+
Dir.glob( 'lib/*.rb' ) +
|
14
|
+
Dir.glob( 'lib/multiarray/*.rb' ) +
|
15
|
+
Dir.glob( 'test/*.rb' )
|
16
|
+
s.test_files = Dir.glob( 'test/tc_*.rb' )
|
17
|
+
s.require_paths = [ 'lib' ]
|
18
|
+
s.rubyforge_project = %q{hornetseye}
|
19
|
+
s.has_rdoc = true
|
20
|
+
s.extra_rdoc_files = [ 'README' ]
|
21
|
+
s.rdoc_options = %w{--exclude=/Makefile|.*\.(rb)/ --main README}
|
22
|
+
s.add_dependency %q<malloc>, [ '~> 0.2' ]
|
23
|
+
end
|
data/test/tc_int.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'multiarray'
|
3
|
+
|
4
|
+
class TC_Int < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@@types = [ Hornetseye::UBYTE,
|
8
|
+
Hornetseye::BYTE,
|
9
|
+
Hornetseye::USINT,
|
10
|
+
Hornetseye::SINT,
|
11
|
+
Hornetseye::UINT,
|
12
|
+
Hornetseye::INT,
|
13
|
+
Hornetseye::ULONG,
|
14
|
+
Hornetseye::LONG ]
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
@@types = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_int_default
|
22
|
+
for t in @@types
|
23
|
+
assert_equal 0, t.default
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_int_to_s
|
28
|
+
assert_equal 'UBYTE', Hornetseye::UBYTE.to_s
|
29
|
+
assert_equal 'BYTE' , Hornetseye::BYTE.to_s
|
30
|
+
assert_equal 'USINT', Hornetseye::USINT.to_s
|
31
|
+
assert_equal 'SINT' , Hornetseye::SINT.to_s
|
32
|
+
assert_equal 'UINT' , Hornetseye::UINT.to_s
|
33
|
+
assert_equal 'INT' , Hornetseye::INT.to_s
|
34
|
+
assert_equal 'ULONG', Hornetseye::ULONG.to_s
|
35
|
+
assert_equal 'LONG' , Hornetseye::LONG.to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_int_inspect
|
39
|
+
for t in @@types
|
40
|
+
assert_equal t.to_s, t.inspect
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_bytesize
|
45
|
+
for i in [ 8, 16, 32, 64 ]
|
46
|
+
assert_equal i, 8 * Hornetseye::INT( i, Hornetseye::UNSIGNED ).bytesize
|
47
|
+
assert_equal i, 8 * Hornetseye::INT( i, Hornetseye::SIGNED ).bytesize
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_typecode
|
52
|
+
for t in @@types
|
53
|
+
assert_equal t, t.typecode
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_shape
|
58
|
+
for t in @@types
|
59
|
+
assert_equal [], t.shape
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_size
|
64
|
+
for t in @@types
|
65
|
+
assert_equal 1, t.size
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_to_s
|
70
|
+
for t in @@types
|
71
|
+
assert_equal '42', t.new( 42 ).to_s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_inspect
|
76
|
+
for t in @@types
|
77
|
+
assert_equal "#{t.inspect}(42)", t.new( 42 ).inspect
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_get_set
|
82
|
+
for t in @@types
|
83
|
+
i = t.new 0
|
84
|
+
assert_equal 0, i.get
|
85
|
+
assert_equal 42, i.set( 42 )
|
86
|
+
assert_equal 42, i.get
|
87
|
+
assert_equal 0, i.set
|
88
|
+
assert_equal 0, i.get
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_at_assign
|
93
|
+
for t in @@types
|
94
|
+
i = t.new 0
|
95
|
+
assert_equal 0, i.at
|
96
|
+
assert_equal 42, i.assign( 42 )
|
97
|
+
assert_equal 42, i.at
|
98
|
+
assert_raise( ArgumentError ) { i.at 0 }
|
99
|
+
assert_raise( ArgumentError ) { i.assign 0, 0 }
|
100
|
+
i = t.new 0
|
101
|
+
assert_equal 0, i[]
|
102
|
+
assert_equal 42, i[] = 42
|
103
|
+
assert_equal 42, i[]
|
104
|
+
assert_raise( ArgumentError ) { i[ 0 ] }
|
105
|
+
assert_raise( ArgumentError ) { i[ 0 ] = 0 }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_op
|
110
|
+
for t in @@types
|
111
|
+
i = t.new 1
|
112
|
+
assert_equal 3, i.op( 2 ) { |x| set get + x }.get
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
data/test/tc_sequence.rb
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'multiarray'
|
3
|
+
|
4
|
+
class TC_Sequence < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@@types = [ Hornetseye::UBYTE,
|
8
|
+
Hornetseye::BYTE,
|
9
|
+
Hornetseye::USINT,
|
10
|
+
Hornetseye::SINT,
|
11
|
+
Hornetseye::UINT,
|
12
|
+
Hornetseye::INT,
|
13
|
+
Hornetseye::ULONG,
|
14
|
+
Hornetseye::LONG ]
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
@@types = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_default
|
22
|
+
for t in @@types
|
23
|
+
assert_equal [ t.default ] * 3, Hornetseye::Sequence( t, 3 ).default.to_a
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_sequence_to_s
|
28
|
+
for t in @@types
|
29
|
+
assert_equal "Sequence(#{t.to_s},3)", Hornetseye::Sequence( t, 3 ).to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_sequence_inspect
|
34
|
+
for t in @@types
|
35
|
+
assert_equal "Sequence(#{t.inspect},3)",
|
36
|
+
Hornetseye::Sequence( t, 3 ).inspect
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_bytesize
|
41
|
+
for t in @@types
|
42
|
+
assert_equal t.bytesize * 3, Hornetseye::Sequence( t, 3 ).bytesize
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_typecode
|
47
|
+
for t in @@types
|
48
|
+
assert_equal t, Hornetseye::Sequence( t, 3 ).typecode
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_empty
|
53
|
+
for t in @@types
|
54
|
+
assert Hornetseye::Sequence( t, 0 ).new.empty?
|
55
|
+
assert !Hornetseye::Sequence( t, 3 ).new.empty?
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_shape
|
60
|
+
for t in @@types
|
61
|
+
assert_equal [ 3 ], Hornetseye::Sequence( t, 3 ).shape
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_size
|
66
|
+
for t in @@types
|
67
|
+
assert_equal 3, Hornetseye::Sequence( t, 3 ).size
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_inspect
|
72
|
+
for t in @@types
|
73
|
+
s = Hornetseye::Sequence( t, 3 ).new
|
74
|
+
s[] = [ 1, 2, 3 ]
|
75
|
+
assert_equal "Sequence(#{t.inspect},3):\n[ 1, 2, 3 ]", s.inspect
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_to_a
|
80
|
+
for t in @@types
|
81
|
+
s = Hornetseye::Sequence( t, 3 ).new
|
82
|
+
s[] = [ 1, 2, 3 ]
|
83
|
+
assert_equal [ 1, 2, 3 ], s.to_a
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_get_set
|
88
|
+
for t in @@types
|
89
|
+
s1 = Hornetseye::Sequence( t, 3 ).new
|
90
|
+
s1[] = 2
|
91
|
+
assert_equal 0, s1.set
|
92
|
+
assert_equal [ 0, 0, 0 ], s1.get.to_a
|
93
|
+
assert_equal [ 0, 0, 0 ], s1.to_a
|
94
|
+
assert_equal 1, s1.set( 1 )
|
95
|
+
assert_equal [ 1, 1, 1 ], s1.to_a
|
96
|
+
assert_equal [ 2, 3 ], s1.set( [ 2, 3 ] )
|
97
|
+
assert_equal [ 2, 3, 0 ], s1.to_a
|
98
|
+
s2 = Hornetseye::Sequence( t, 3 ).new
|
99
|
+
s2[] = [ 1, 2, 3 ]
|
100
|
+
s1[] = s2
|
101
|
+
assert_equal [ 1, 2, 3 ], s2.to_a
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_at_assign
|
106
|
+
for t in @@types
|
107
|
+
s = Hornetseye::Sequence( t, 3 ).new
|
108
|
+
s[] = 0
|
109
|
+
assert_equal [ 0, 0, 0 ], [ s.at( 0 ), s.at( 1 ), s.at( 2 ) ]
|
110
|
+
assert_equal [ 1, 2, 3 ], [ s.assign( 0, 1 ),
|
111
|
+
s.assign( 1, 2 ),
|
112
|
+
s.assign( 2, 3 ) ]
|
113
|
+
assert_equal [ 1, 2, 3 ], [ s.at( 0 ), s.at( 1 ), s.at( 2 ) ]
|
114
|
+
assert_raise( ArgumentError ) { s.at 0, 0 }
|
115
|
+
assert_nothing_raised { s.at }
|
116
|
+
s = Hornetseye::Sequence( t, 3 ).new
|
117
|
+
s[] = 0
|
118
|
+
assert_equal [ 0, 0, 0 ], [ s[ 0 ], s[ 1 ], s[ 2 ] ]
|
119
|
+
assert_equal [ 1, 2, 3 ], [ s[ 0 ] = 1, s[ 1 ] = 2, s[ 2 ] = 3 ]
|
120
|
+
assert_equal [ 1, 2, 3 ], [ s[ 0 ], s[ 1 ], s[ 2 ] ]
|
121
|
+
assert_raise( ArgumentError ) { s[ 0, 0 ] }
|
122
|
+
assert_nothing_raised { s[] }
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
metadata
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: multiarray
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jan Wedekind
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-12-09 00:00:00 +00:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: malloc
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ~>
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0.2"
|
24
|
+
version:
|
25
|
+
description: This Ruby-extension defines Hornetseye::MultiArray and other native datatypes. Hornetseye::MultiArray provides multi-dimensional Ruby arrays with elements of same type. The extension is designed to be mostly compatible with Masahiro Tanaka's NArray. However it allows the definition of custom element types and operations on them. This work was also inspired by Ronald Garcia's boost::multi_array and by Todd Veldhuizen's Blitz++.
|
26
|
+
email: jan@wedesoft.de
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README
|
33
|
+
files:
|
34
|
+
- source.gemspec
|
35
|
+
- Makefile
|
36
|
+
- README
|
37
|
+
- COPYING
|
38
|
+
- lib/multiarray.rb
|
39
|
+
- lib/multiarray/composite_type.rb
|
40
|
+
- lib/multiarray/multiarray.rb
|
41
|
+
- lib/multiarray/sequence.rb
|
42
|
+
- lib/multiarray/list.rb
|
43
|
+
- lib/multiarray/descriptortype.rb
|
44
|
+
- lib/multiarray/type_operation.rb
|
45
|
+
- lib/multiarray/int.rb
|
46
|
+
- lib/multiarray/type.rb
|
47
|
+
- lib/multiarray/storage.rb
|
48
|
+
- lib/multiarray/memory.rb
|
49
|
+
- lib/multiarray/sequence_operation.rb
|
50
|
+
- test/ts_multiarray.rb
|
51
|
+
- test/tc_int.rb
|
52
|
+
- test/tc_sequence.rb
|
53
|
+
has_rdoc: true
|
54
|
+
homepage: http://wedesoft.github.com/multiarray/
|
55
|
+
licenses: []
|
56
|
+
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options:
|
59
|
+
- --exclude=/Makefile|.*\.(rb)/
|
60
|
+
- --main
|
61
|
+
- README
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
69
|
+
version:
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: "0"
|
75
|
+
version:
|
76
|
+
requirements: []
|
77
|
+
|
78
|
+
rubyforge_project: hornetseye
|
79
|
+
rubygems_version: 1.3.5
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: Multi-dimensional and uniform Ruby arrays
|
83
|
+
test_files:
|
84
|
+
- test/tc_int.rb
|
85
|
+
- test/tc_sequence.rb
|