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.
@@ -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,13 @@
1
+ module Hornetseye
2
+
3
+ class Storage
4
+
5
+ attr_reader :ptr
6
+
7
+ def initialize( data )
8
+ @data = data
9
+ end
10
+
11
+ end
12
+
13
+ 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
@@ -0,0 +1,12 @@
1
+ module Hornetseye
2
+
3
+ module TypeOperation
4
+
5
+ def op( *args, &action )
6
+ instance_exec *args, &action
7
+ self
8
+ end
9
+
10
+ end
11
+
12
+ 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
@@ -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
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'tc_int'
3
+ require 'tc_sequence'
4
+
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