multiarray 0.2.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +5 -2
- data/lib/multiarray.rb +45 -20
- data/lib/multiarray/int.rb +1 -1
- data/lib/multiarray/int_.rb +87 -60
- data/lib/multiarray/lazy.rb +76 -0
- data/lib/multiarray/list.rb +33 -74
- data/lib/multiarray/malloc.rb +11 -0
- data/lib/multiarray/multiarray.rb +19 -1
- data/lib/multiarray/object.rb +36 -19
- data/lib/multiarray/pointer.rb +11 -0
- data/lib/multiarray/pointer_.rb +223 -0
- data/lib/multiarray/sequence.rb +14 -10
- data/lib/multiarray/sequence_.rb +40 -106
- data/lib/multiarray/type.rb +101 -129
- data/test/tc_int.rb +78 -76
- data/test/tc_multiarray.rb +97 -15
- data/test/tc_object.rb +52 -45
- data/test/tc_sequence.rb +89 -106
- data/test/ts_multiarray.rb +0 -1
- metadata +6 -8
- data/lib/multiarray/composite_type.rb +0 -67
- data/lib/multiarray/descriptortype.rb +0 -43
- data/lib/multiarray/memory.rb +0 -112
- data/lib/multiarray/sequence_operation.rb +0 -52
- data/lib/multiarray/storage.rb +0 -23
- data/lib/multiarray/type_operation.rb +0 -32
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ require 'rake/packagetask'
|
|
6
6
|
require 'rbconfig'
|
7
7
|
|
8
8
|
PKG_NAME = 'multiarray'
|
9
|
-
PKG_VERSION = '0.
|
9
|
+
PKG_VERSION = '0.4.0'
|
10
10
|
RB_FILES = FileList[ 'lib/**/*.rb' ]
|
11
11
|
TC_FILES = FileList[ 'test/tc_*.rb' ]
|
12
12
|
TS_FILES = FileList[ 'test/ts_*.rb' ]
|
@@ -20,7 +20,10 @@ HOMEPAGE = %q{http://wedesoft.github.com/multiarray/}
|
|
20
20
|
|
21
21
|
$SITELIBDIR = Config::CONFIG[ 'sitelibdir' ]
|
22
22
|
|
23
|
-
task :default
|
23
|
+
task :default => :all
|
24
|
+
|
25
|
+
desc 'Do nothing (default)'
|
26
|
+
task :all do
|
24
27
|
end
|
25
28
|
|
26
29
|
desc 'Install Ruby extension'
|
data/lib/multiarray.rb
CHANGED
@@ -1,24 +1,11 @@
|
|
1
|
-
|
2
|
-
require 'multiarray/storage'
|
3
|
-
require 'multiarray/list'
|
4
|
-
require 'multiarray/memory'
|
5
|
-
require 'multiarray/type'
|
6
|
-
require 'multiarray/type_operation'
|
7
|
-
require 'multiarray/descriptortype'
|
8
|
-
require 'multiarray/object'
|
9
|
-
require 'multiarray/int_'
|
10
|
-
require 'multiarray/int'
|
11
|
-
require 'multiarray/composite_type'
|
12
|
-
require 'multiarray/sequence_'
|
13
|
-
require 'multiarray/sequence'
|
14
|
-
require 'multiarray/sequence_operation'
|
15
|
-
require 'multiarray/multiarray'
|
16
|
-
|
17
|
-
# @private
|
1
|
+
# Proc#bind is defined if it does not exist already
|
18
2
|
class Proc
|
19
3
|
|
20
|
-
# @private
|
21
4
|
unless method_defined? :bind
|
5
|
+
|
6
|
+
# Proc#bind is defined if it does not exist already
|
7
|
+
#
|
8
|
+
# @private
|
22
9
|
def bind( object )
|
23
10
|
block, time = self, Time.now
|
24
11
|
( class << object; self end ).class_eval do
|
@@ -29,18 +16,56 @@ class Proc
|
|
29
16
|
method
|
30
17
|
end.bind object
|
31
18
|
end
|
19
|
+
|
32
20
|
end
|
33
21
|
|
34
22
|
end
|
35
23
|
|
36
|
-
#
|
24
|
+
# Object#instance_exec is defined if it does not exist already
|
37
25
|
class Object
|
38
26
|
|
39
|
-
# @private
|
40
27
|
unless method_defined? :instance_exec
|
28
|
+
|
29
|
+
# Object#instance_exec is defined if it does not exist already
|
30
|
+
#
|
31
|
+
# @private
|
41
32
|
def instance_exec( *arguments, &block )
|
42
33
|
block.bind( self )[ *arguments ]
|
43
34
|
end
|
35
|
+
|
44
36
|
end
|
45
37
|
|
46
38
|
end
|
39
|
+
|
40
|
+
# Module#alias_method_chain is defined.
|
41
|
+
#
|
42
|
+
# @private
|
43
|
+
class Module
|
44
|
+
|
45
|
+
unless method_defined? :alias_method_chain
|
46
|
+
|
47
|
+
# Method for creating alias chains.
|
48
|
+
#
|
49
|
+
# @private
|
50
|
+
def alias_method_chain( target, feature, vocalize = target )
|
51
|
+
alias_method "#{vocalize}_without_#{feature}", target
|
52
|
+
alias_method target, "#{vocalize}_with_#{feature}"
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
require 'malloc'
|
60
|
+
require 'multiarray/lazy'
|
61
|
+
require 'multiarray/list'
|
62
|
+
require 'multiarray/malloc'
|
63
|
+
require 'multiarray/type'
|
64
|
+
require 'multiarray/object'
|
65
|
+
require 'multiarray/int_'
|
66
|
+
require 'multiarray/int'
|
67
|
+
require 'multiarray/pointer_'
|
68
|
+
require 'multiarray/pointer'
|
69
|
+
require 'multiarray/sequence_'
|
70
|
+
require 'multiarray/sequence'
|
71
|
+
require 'multiarray/multiarray'
|
data/lib/multiarray/int.rb
CHANGED
data/lib/multiarray/int_.rb
CHANGED
@@ -5,10 +5,25 @@ module Hornetseye
|
|
5
5
|
# @see #INT
|
6
6
|
#
|
7
7
|
# @abstract
|
8
|
-
class INT_ <
|
8
|
+
class INT_ < Type
|
9
9
|
|
10
10
|
class << self
|
11
11
|
|
12
|
+
# Get memory type for storing objects of this type
|
13
|
+
#
|
14
|
+
# @return [Class] Returns +Malloc+.
|
15
|
+
#
|
16
|
+
# @see Malloc
|
17
|
+
#
|
18
|
+
# @private
|
19
|
+
def memory
|
20
|
+
Malloc
|
21
|
+
end
|
22
|
+
|
23
|
+
def import( str )
|
24
|
+
new str.unpack( descriptor ).first
|
25
|
+
end
|
26
|
+
|
12
27
|
# The number of bits of native integers represented by this class
|
13
28
|
#
|
14
29
|
# @return [Integer] Number of bits of native integer.
|
@@ -28,73 +43,36 @@ module Hornetseye
|
|
28
43
|
# @private
|
29
44
|
attr_accessor :signed
|
30
45
|
|
31
|
-
# Returns the type of storage object for storing values
|
32
|
-
#
|
33
|
-
# @return [Class] Returns +Memory+.
|
34
|
-
#
|
35
|
-
# @private
|
36
|
-
def storage
|
37
|
-
Memory
|
38
|
-
end
|
39
|
-
|
40
|
-
# Number of bytes for storing an object of this type
|
41
|
-
#
|
42
|
-
# @return [Integer] Number of bytes to store a native integer of this
|
43
|
-
# type.
|
44
|
-
#
|
45
|
-
# @private
|
46
|
-
def bytesize
|
47
|
-
( bits + 7 ).div 8
|
48
|
-
end
|
49
|
-
|
50
|
-
# Default value for integers
|
51
|
-
#
|
52
|
-
# @return [Object] Returns +0+.
|
53
|
-
#
|
54
|
-
# @private
|
55
|
-
def default
|
56
|
-
0
|
57
|
-
end
|
58
|
-
|
59
46
|
# Get string with information about this type
|
60
47
|
#
|
61
48
|
# @return [String] Information about this integer type.
|
62
49
|
def to_s
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
50
|
+
if bits and signed != nil
|
51
|
+
case [ bits, signed ]
|
52
|
+
when [ 8, true ]
|
53
|
+
'BYTE'
|
54
|
+
when [ 8, false ]
|
55
|
+
'UBYTE'
|
56
|
+
when [ 16, true ]
|
57
|
+
'SINT'
|
58
|
+
when [ 16, false ]
|
59
|
+
'USINT'
|
60
|
+
when [ 32, true ]
|
61
|
+
'INT'
|
62
|
+
when [ 32, false ]
|
63
|
+
'UINT'
|
64
|
+
when [ 64, true ]
|
65
|
+
'LONG'
|
66
|
+
when [ 64, false ]
|
67
|
+
'ULONG'
|
68
|
+
else
|
69
|
+
"INT(#{bits.inspect},#{ signed ? 'SIGNED' : 'UNSIGNED' })"
|
70
|
+
end
|
80
71
|
else
|
81
|
-
|
72
|
+
super
|
82
73
|
end
|
83
74
|
end
|
84
75
|
|
85
|
-
# Get string with information about this type
|
86
|
-
#
|
87
|
-
# @return [String] Information about this integer type.
|
88
|
-
def inspect
|
89
|
-
to_s
|
90
|
-
end
|
91
|
-
|
92
|
-
# Get descriptor for packing/unpacking native values
|
93
|
-
#
|
94
|
-
# @see DescriptorType.pack
|
95
|
-
# @see DescriptorType.unpack
|
96
|
-
#
|
97
|
-
# @private
|
98
76
|
def descriptor
|
99
77
|
case [ bits, signed ]
|
100
78
|
when [ 8, true ]
|
@@ -118,6 +96,55 @@ module Hornetseye
|
|
118
96
|
end
|
119
97
|
end
|
120
98
|
|
99
|
+
# Get string with information about this type
|
100
|
+
#
|
101
|
+
# @return [String] Information about this integer type.
|
102
|
+
def inspect
|
103
|
+
to_s
|
104
|
+
end
|
105
|
+
|
106
|
+
# Default value for Ruby objects
|
107
|
+
#
|
108
|
+
# @return [Integer] Returns +0+.
|
109
|
+
#
|
110
|
+
# @private
|
111
|
+
def default
|
112
|
+
0
|
113
|
+
end
|
114
|
+
|
115
|
+
#def fetch( ptr )
|
116
|
+
# new ptr.read( storage_size ).unpack( descriptor ).first
|
117
|
+
#end
|
118
|
+
|
119
|
+
def storage_size
|
120
|
+
( bits + 7 ).div 8
|
121
|
+
end
|
122
|
+
|
123
|
+
def ==( other )
|
124
|
+
if other.is_a? Class
|
125
|
+
if other < INT_ and bits == other.bits and signed == other.signed
|
126
|
+
true
|
127
|
+
else
|
128
|
+
false
|
129
|
+
end
|
130
|
+
else
|
131
|
+
false
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def hash
|
136
|
+
[ :INT_, bits, signed ].hash
|
137
|
+
end
|
138
|
+
|
139
|
+
def eql?( other )
|
140
|
+
self == other
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
def store( ptr )
|
146
|
+
ptr.write [ @value ].pack( self.class.descriptor )
|
147
|
+
self
|
121
148
|
end
|
122
149
|
|
123
150
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Hornetseye
|
2
|
+
|
3
|
+
class Lazy
|
4
|
+
|
5
|
+
def initialize( *values )
|
6
|
+
options = values.last.is_a?( Hash ) ? values.pop : {}
|
7
|
+
@values = values
|
8
|
+
if options[ :action ]
|
9
|
+
@action = options[ :action ]
|
10
|
+
else
|
11
|
+
unless @values.size == 1
|
12
|
+
raise "#{@values.size} value(s) where specified without defining " +
|
13
|
+
":action"
|
14
|
+
end
|
15
|
+
@action = proc { |*x| x.first }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
'<delayed>'
|
21
|
+
end
|
22
|
+
|
23
|
+
def force
|
24
|
+
@action.call *@values.collect { |value| value.force }
|
25
|
+
end
|
26
|
+
|
27
|
+
def fetch( type )
|
28
|
+
type.new Lazy.new( self, :action => proc { |x| x.fetch } )
|
29
|
+
end
|
30
|
+
|
31
|
+
def element( index )
|
32
|
+
elements = @values.collect { |value| value.element index }
|
33
|
+
Lazy.new( *( elements + [ :action => @action ] ) )
|
34
|
+
end
|
35
|
+
|
36
|
+
def -@
|
37
|
+
Lazy.new self, :action => proc { |x| -x }
|
38
|
+
end
|
39
|
+
|
40
|
+
def +@
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def +( other )
|
45
|
+
Lazy.new self, other, :action => proc { |x,y| x + y }
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def lazy
|
51
|
+
previous = Thread.current[ :lazy ]
|
52
|
+
Thread.current[ :lazy ] = true
|
53
|
+
begin
|
54
|
+
retval = yield
|
55
|
+
ensure
|
56
|
+
Thread.current[ :lazy ] = previous
|
57
|
+
end
|
58
|
+
retval
|
59
|
+
end
|
60
|
+
|
61
|
+
module_function :lazy
|
62
|
+
|
63
|
+
def eager
|
64
|
+
previous = Thread.current[ :lazy ]
|
65
|
+
Thread.current[ :lazy ] = false
|
66
|
+
begin
|
67
|
+
retval = yield
|
68
|
+
ensure
|
69
|
+
Thread.current[ :lazy ] = previous
|
70
|
+
end
|
71
|
+
retval
|
72
|
+
end
|
73
|
+
|
74
|
+
module_function :eager
|
75
|
+
|
76
|
+
end
|
data/lib/multiarray/list.rb
CHANGED
@@ -1,99 +1,60 @@
|
|
1
1
|
module Hornetseye
|
2
|
-
|
2
|
+
|
3
3
|
# Class for creating views on Ruby arrays
|
4
4
|
#
|
5
|
-
# @see Storage
|
6
|
-
# @see Memory
|
7
5
|
# @private
|
8
|
-
class List
|
9
|
-
|
10
|
-
class << self
|
11
|
-
|
12
|
-
# Create a +List+ object viewing a new Ruby array
|
13
|
-
#
|
14
|
-
# @param [Integer] size Number of elements the new Ruby array should
|
15
|
-
# have.
|
16
|
-
# @return [List] The new +List+ object.
|
17
|
-
#
|
18
|
-
# @private
|
19
|
-
def alloc( size )
|
20
|
-
new Array.new( size )
|
21
|
-
end
|
22
|
-
|
23
|
-
# Create a +List+ object viewing an existing Ruby array
|
24
|
-
#
|
25
|
-
# @param [Array<Object>] arr Existing Ruby array.
|
26
|
-
# @return [List] The new +List+ object.
|
27
|
-
#
|
28
|
-
# @private
|
29
|
-
def import( arr )
|
30
|
-
new arr
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
6
|
+
class List
|
34
7
|
|
35
|
-
#
|
8
|
+
# Create view on a Ruby array
|
9
|
+
#
|
10
|
+
# @param [Integer] n Number of elements of the view.
|
11
|
+
# @option options [Array<Object>] :array ([nil] * n) The Ruby array.
|
12
|
+
# @option options [Integer] :offset (0) Offset of the view.
|
36
13
|
#
|
37
14
|
# @private
|
38
|
-
|
15
|
+
def initialize( n, options = {} )
|
16
|
+
@array = options[ :array ] || [ nil ] * n
|
17
|
+
@offset = options[ :offset ] || 0
|
18
|
+
end
|
39
19
|
|
40
|
-
#
|
20
|
+
# Display information about this object
|
41
21
|
#
|
42
|
-
# @
|
22
|
+
# @return [String] A string with information about the size of this view.
|
23
|
+
def inspect
|
24
|
+
"List(#{@array.size - @offset})"
|
25
|
+
end
|
26
|
+
|
27
|
+
# Retrieve and map element from the array
|
43
28
|
#
|
44
|
-
# @
|
45
|
-
|
46
|
-
|
47
|
-
|
29
|
+
# @param [Class] type Native data type to create
|
30
|
+
# @return [Type] The mapped element.
|
31
|
+
def fetch( type )
|
32
|
+
type.new read
|
48
33
|
end
|
49
34
|
|
50
35
|
# Retrieve an element from the array
|
51
36
|
#
|
52
|
-
# @param [Type] typecode This parameter is ignored.
|
53
37
|
# @return [Object] The element from the array.
|
54
38
|
#
|
55
|
-
# @see #
|
56
|
-
# @see
|
39
|
+
# @see #write
|
40
|
+
# @see Malloc#read
|
41
|
+
#
|
57
42
|
# @private
|
58
|
-
def
|
59
|
-
@
|
43
|
+
def read
|
44
|
+
@array[ @offset ]
|
60
45
|
end
|
61
46
|
|
62
47
|
# Store an element in the array
|
63
48
|
#
|
64
|
-
# @param [Type] typecode This parameter is ignored.
|
65
49
|
# @param [Object] value The Ruby object to store.
|
66
50
|
# @return [Object] Returns the parameter +value+.
|
67
51
|
#
|
68
|
-
# @see #
|
69
|
-
# @see
|
70
|
-
# @private
|
71
|
-
def store( typecode, value )
|
72
|
-
@data[ @offset ] = value
|
73
|
-
end
|
74
|
-
|
75
|
-
# Store multiple elements in the array
|
76
|
-
#
|
77
|
-
# @param [Array<Object>] data A Ruby array with the new data.
|
78
|
-
# @return [Array<Object>] The parameter +data+.
|
79
|
-
#
|
80
|
-
# @see #export
|
81
|
-
# @see Memory#import
|
82
|
-
# @private
|
83
|
-
def import( data )
|
84
|
-
@data[ @offset ... @offset + data.size ] = data
|
85
|
-
end
|
86
|
-
|
87
|
-
# Retrieve multiple elements from the array
|
88
|
-
#
|
89
|
-
# @param [Integer] size Number of elements to retrieve
|
90
|
-
# @return [Array<Object>] A Ruby array with the elements.
|
52
|
+
# @see #read
|
53
|
+
# @see Malloc#write
|
91
54
|
#
|
92
|
-
# @see #import
|
93
|
-
# @see Memory#export
|
94
55
|
# @private
|
95
|
-
def
|
96
|
-
@
|
56
|
+
def write( value )
|
57
|
+
@array[ @offset ] = value
|
97
58
|
end
|
98
59
|
|
99
60
|
# Create a new view with the specified offset
|
@@ -101,12 +62,10 @@ module Hornetseye
|
|
101
62
|
# @param [Integer] offset A non-negative offset.
|
102
63
|
# @return [List] A new view for the specified part of the array.
|
103
64
|
#
|
104
|
-
# @see
|
65
|
+
# @see Malloc#+
|
105
66
|
# @private
|
106
67
|
def +( offset )
|
107
|
-
|
108
|
-
retval.offset = @offset + offset
|
109
|
-
retval
|
68
|
+
List.new 0, :array => @array, :offset => @offset + offset
|
110
69
|
end
|
111
70
|
|
112
71
|
end
|