multiarray 0.5.2 → 0.6.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/Rakefile +2 -1
- data/TODO +7 -36
- data/lib/multiarray/bool.rb +14 -4
- data/lib/multiarray/complex.rb +467 -38
- data/lib/multiarray/composite.rb +44 -0
- data/lib/multiarray/diagonal.rb +10 -3
- data/lib/multiarray/element.rb +29 -3
- data/lib/multiarray/elementwise.rb +32 -3
- data/lib/multiarray/float.rb +120 -18
- data/lib/multiarray/gccfunction.rb +11 -21
- data/lib/multiarray/gcctype.rb +23 -17
- data/lib/multiarray/gccvalue.rb +25 -2
- data/lib/multiarray/histogram.rb +82 -0
- data/lib/multiarray/index.rb +23 -0
- data/lib/multiarray/inject.rb +13 -1
- data/lib/multiarray/int.rb +105 -9
- data/lib/multiarray/integral.rb +82 -0
- data/lib/multiarray/lambda.rb +58 -8
- data/lib/multiarray/list.rb +27 -1
- data/lib/multiarray/lookup.rb +60 -0
- data/lib/multiarray/lut.rb +102 -0
- data/lib/multiarray/malloc.rb +16 -0
- data/lib/multiarray/methods.rb +17 -0
- data/lib/multiarray/multiarray.rb +24 -2
- data/lib/multiarray/node.rb +115 -21
- data/lib/multiarray/object.rb +34 -4
- data/lib/multiarray/operations.rb +92 -100
- data/lib/multiarray/pointer.rb +74 -1
- data/lib/multiarray/rgb.rb +324 -2
- data/lib/multiarray/sequence.rb +69 -4
- data/lib/multiarray/shortcuts.rb +71 -0
- data/lib/multiarray/store.rb +72 -0
- data/lib/multiarray/variable.rb +25 -0
- data/lib/multiarray.rb +47 -5
- data/test/tc_int.rb +10 -0
- data/test/tc_multiarray.rb +47 -1
- data/test/tc_object.rb +10 -0
- data/test/tc_sequence.rb +237 -8
- metadata +9 -9
data/lib/multiarray/composite.rb
CHANGED
@@ -17,26 +17,55 @@
|
|
17
17
|
# Namespace of Hornetseye computer vision library
|
18
18
|
module Hornetseye
|
19
19
|
|
20
|
+
# Base class for composite types
|
20
21
|
class Composite < Element
|
21
22
|
|
22
23
|
class << self
|
23
24
|
|
25
|
+
# Access element type of composite type
|
26
|
+
#
|
27
|
+
# @return [Class] The element type.
|
24
28
|
attr_accessor :element_type
|
25
29
|
|
30
|
+
# Get number of elements of composite type
|
31
|
+
#
|
32
|
+
# @return [Integer] Number of elements.
|
26
33
|
attr_accessor :num_elements
|
27
34
|
|
35
|
+
# Memory type required to store elements of this type
|
36
|
+
#
|
37
|
+
# @return [Class] Returns +element_type.memory+.
|
38
|
+
#
|
39
|
+
# @private
|
28
40
|
def memory
|
29
41
|
element_type.memory
|
30
42
|
end
|
31
43
|
|
44
|
+
# Get storage size to store an element of this type
|
45
|
+
#
|
46
|
+
# @return [Integer] Returns +element_type.storage_size * num_elements+.
|
47
|
+
#
|
48
|
+
# @private
|
32
49
|
def storage_size
|
33
50
|
element_type.storage_size * num_elements
|
34
51
|
end
|
35
52
|
|
53
|
+
# Directive for packing/unpacking elements of this type
|
54
|
+
#
|
55
|
+
# @return [String] Returns string with directive.
|
56
|
+
#
|
57
|
+
# @private
|
36
58
|
def directive
|
37
59
|
element_type.directive * num_elements
|
38
60
|
end
|
39
61
|
|
62
|
+
# Get unique descriptor of this class
|
63
|
+
#
|
64
|
+
# @param [Hash] hash Labels for any variables.
|
65
|
+
#
|
66
|
+
# @return [String] Descriptor of this class.
|
67
|
+
#
|
68
|
+
# @private
|
40
69
|
def descriptor( hash )
|
41
70
|
unless element_type.nil?
|
42
71
|
inspect
|
@@ -45,14 +74,29 @@ module Hornetseye
|
|
45
74
|
end
|
46
75
|
end
|
47
76
|
|
77
|
+
# Base type of this data type
|
78
|
+
#
|
79
|
+
# @return [Class] Returns +element_type+.
|
80
|
+
#
|
81
|
+
# @private
|
48
82
|
def basetype
|
49
83
|
element_type
|
50
84
|
end
|
51
85
|
|
86
|
+
# Get list of types of composite type
|
87
|
+
#
|
88
|
+
# @return [Array<Class>] List of types.
|
89
|
+
#
|
90
|
+
# @private
|
52
91
|
def typecodes
|
53
92
|
[ element_type ] * num_elements
|
54
93
|
end
|
55
94
|
|
95
|
+
# Scalar type to this type
|
96
|
+
#
|
97
|
+
# @return [Class] Returns +element_type+.
|
98
|
+
#
|
99
|
+
# @private
|
56
100
|
def scalar
|
57
101
|
element_type
|
58
102
|
end
|
data/lib/multiarray/diagonal.rb
CHANGED
@@ -22,6 +22,11 @@ module Hornetseye
|
|
22
22
|
|
23
23
|
class << self
|
24
24
|
|
25
|
+
# Check whether objects of this class are finalised computations
|
26
|
+
#
|
27
|
+
# @return [Boolean] Returns +false+.
|
28
|
+
#
|
29
|
+
# @private
|
25
30
|
def finalised?
|
26
31
|
false
|
27
32
|
end
|
@@ -56,9 +61,9 @@ module Hornetseye
|
|
56
61
|
"#{@block.descriptor( hash )})"
|
57
62
|
end
|
58
63
|
|
59
|
-
#
|
64
|
+
# Get type of result of delayed operation
|
60
65
|
#
|
61
|
-
# @return [Class]
|
66
|
+
# @return [Class] Type of result.
|
62
67
|
#
|
63
68
|
# @private
|
64
69
|
def array_type
|
@@ -97,6 +102,8 @@ module Hornetseye
|
|
97
102
|
# @param [Integer,Node] i Index of desired element.
|
98
103
|
#
|
99
104
|
# @return [Node,Object] Element of diagonal injection.
|
105
|
+
#
|
106
|
+
# @private
|
100
107
|
def element( i )
|
101
108
|
Diagonal.new @value.element( i ), @index0, @index1, @index2, @initial,
|
102
109
|
@block, @var1, @var2
|
@@ -161,7 +168,7 @@ module Hornetseye
|
|
161
168
|
|
162
169
|
# Check whether this term is compilable
|
163
170
|
#
|
164
|
-
# @return [
|
171
|
+
# @return [Boolean] Returns whether this term is compilable.
|
165
172
|
#
|
166
173
|
# @private
|
167
174
|
def compilable?
|
data/lib/multiarray/element.rb
CHANGED
@@ -32,15 +32,24 @@ module Hornetseye
|
|
32
32
|
construct *ptr.load( self )
|
33
33
|
end
|
34
34
|
|
35
|
+
# Construct new object from arguments
|
36
|
+
#
|
37
|
+
# @param [Array<Object>] *args Arguments for constructor.
|
38
|
+
#
|
39
|
+
# @return [Element] New object of this type.
|
40
|
+
#
|
41
|
+
# @private
|
35
42
|
def construct( *args )
|
36
43
|
new *args
|
37
44
|
end
|
38
45
|
|
39
46
|
# Type coercion for native elements
|
40
47
|
#
|
41
|
-
# @param [
|
48
|
+
# @param [Class] other Other native datatype to coerce with.
|
49
|
+
#
|
50
|
+
# @return [Class] Result of coercion.
|
42
51
|
#
|
43
|
-
# @
|
52
|
+
# @private
|
44
53
|
def coercion( other )
|
45
54
|
if self == other
|
46
55
|
self
|
@@ -107,7 +116,7 @@ module Hornetseye
|
|
107
116
|
|
108
117
|
# Check whether this term is compilable
|
109
118
|
#
|
110
|
-
# @return [
|
119
|
+
# @return [Boolean] Returns whether this term is compilable.
|
111
120
|
#
|
112
121
|
# @private
|
113
122
|
def compilable?
|
@@ -118,6 +127,14 @@ module Hornetseye
|
|
118
127
|
end
|
119
128
|
end
|
120
129
|
|
130
|
+
# Skip elements of an array
|
131
|
+
#
|
132
|
+
# @param [Variable] index Variable identifying index of array.
|
133
|
+
# @param [Node] start Wrapped integer with number of elements to skip.
|
134
|
+
#
|
135
|
+
# @return [Node] Returns +self+.
|
136
|
+
#
|
137
|
+
# @private
|
121
138
|
def skip( index, start )
|
122
139
|
self
|
123
140
|
end
|
@@ -125,6 +142,8 @@ module Hornetseye
|
|
125
142
|
# Get value of this native element
|
126
143
|
#
|
127
144
|
# @return [Object] Value of this native element.
|
145
|
+
#
|
146
|
+
# @private
|
128
147
|
def get
|
129
148
|
@value
|
130
149
|
end
|
@@ -134,6 +153,8 @@ module Hornetseye
|
|
134
153
|
# @param [Object] value New value for native element.
|
135
154
|
#
|
136
155
|
# @return [Object] Returns +value+.
|
156
|
+
#
|
157
|
+
# @private
|
137
158
|
def store( value )
|
138
159
|
if @value.respond_to? :store
|
139
160
|
@value.store value.simplify.get
|
@@ -155,6 +176,11 @@ module Hornetseye
|
|
155
176
|
ptr.save self
|
156
177
|
end
|
157
178
|
|
179
|
+
# Get array with components of this value
|
180
|
+
#
|
181
|
+
# @return [Array<Object>] Get array with value of this object as single element.
|
182
|
+
#
|
183
|
+
# @private
|
158
184
|
def values
|
159
185
|
[ @value ]
|
160
186
|
end
|
@@ -54,6 +54,11 @@ module Hornetseye
|
|
54
54
|
inspect
|
55
55
|
end
|
56
56
|
|
57
|
+
# Check whether objects of this class are finalised computations
|
58
|
+
#
|
59
|
+
# @return [Boolean] Returns +false+.
|
60
|
+
#
|
61
|
+
# @private
|
57
62
|
def finalised?
|
58
63
|
false
|
59
64
|
end
|
@@ -80,9 +85,9 @@ module Hornetseye
|
|
80
85
|
"(#{@values.collect { |value| value.descriptor( hash ) }.join ','})"
|
81
86
|
end
|
82
87
|
|
83
|
-
#
|
88
|
+
# Get type of result of delayed operation
|
84
89
|
#
|
85
|
-
# @return [Class]
|
90
|
+
# @return [Class] Type of result.
|
86
91
|
#
|
87
92
|
# @private
|
88
93
|
def array_type
|
@@ -139,6 +144,15 @@ module Hornetseye
|
|
139
144
|
self.class.new( *stripped.collect { |elem| elem[ 2 ] } )
|
140
145
|
end
|
141
146
|
|
147
|
+
# Skip elements of an array
|
148
|
+
#
|
149
|
+
# @param [Variable] index Variable identifying index of array.
|
150
|
+
# @param [Node] start Wrapped integer with number of elements to skip.
|
151
|
+
#
|
152
|
+
# @return [Node] Returns element-wise operation with elements skipped on each
|
153
|
+
# operand.
|
154
|
+
#
|
155
|
+
# @private
|
142
156
|
def skip( index, start )
|
143
157
|
skipped = *@values.collect { |value| value.skip( index, start ) }
|
144
158
|
self.class.new( *skipped ).demand
|
@@ -149,6 +163,8 @@ module Hornetseye
|
|
149
163
|
# @param [Integer,Node] i Index of desired element.
|
150
164
|
#
|
151
165
|
# @return [Node,Object] Element of unary operation.
|
166
|
+
#
|
167
|
+
# @private
|
152
168
|
def element( i )
|
153
169
|
values = @values.collect do |value|
|
154
170
|
value.dimension == 0 ? value : value.element( i )
|
@@ -156,6 +172,14 @@ module Hornetseye
|
|
156
172
|
self.class.new( *values ).demand
|
157
173
|
end
|
158
174
|
|
175
|
+
# Extract array view with part of array
|
176
|
+
#
|
177
|
+
# @param [Integer,Node] start Number of elements to skip.
|
178
|
+
# @param [Integer,Node] length Size of array view.
|
179
|
+
#
|
180
|
+
# @return [Node] Array view with the specified elements.
|
181
|
+
#
|
182
|
+
# @private
|
159
183
|
def slice( start, length )
|
160
184
|
values = @values.collect do |value|
|
161
185
|
value.dimension == 0 ? value : value.slice( start, length )
|
@@ -163,6 +187,11 @@ module Hornetseye
|
|
163
187
|
self.class.new( *values ).demand
|
164
188
|
end
|
165
189
|
|
190
|
+
# Decompose composite elements
|
191
|
+
#
|
192
|
+
# This method decomposes composite elements into array.
|
193
|
+
#
|
194
|
+
# @return [Node] Result of decomposition.
|
166
195
|
def decompose
|
167
196
|
values = @values.collect { |value| value.decompose }
|
168
197
|
self.class.new( *values ).demand
|
@@ -170,7 +199,7 @@ module Hornetseye
|
|
170
199
|
|
171
200
|
# Check whether this term is compilable
|
172
201
|
#
|
173
|
-
# @return [
|
202
|
+
# @return [Boolean] Returns whether this term is compilable.
|
174
203
|
#
|
175
204
|
# @private
|
176
205
|
def compilable?
|
data/lib/multiarray/float.rb
CHANGED
@@ -23,18 +23,40 @@ module Hornetseye
|
|
23
23
|
|
24
24
|
attr_accessor :double
|
25
25
|
|
26
|
+
# Memory type required to store elements of this type
|
27
|
+
#
|
28
|
+
# @return [Class] Returns +Malloc+.
|
29
|
+
#
|
30
|
+
# @private
|
26
31
|
def memory
|
27
32
|
Malloc
|
28
33
|
end
|
29
34
|
|
35
|
+
# Get storage size to store an element of this type
|
36
|
+
#
|
37
|
+
# @return [Integer] Returns +4+ or +8+.
|
38
|
+
#
|
39
|
+
# @private
|
30
40
|
def storage_size
|
31
41
|
double ? 8 : 4
|
32
42
|
end
|
33
43
|
|
44
|
+
# Get default value for elements of this type
|
45
|
+
#
|
46
|
+
# @return [Object] Returns +0.0+.
|
47
|
+
#
|
48
|
+
# @private
|
34
49
|
def default
|
35
50
|
0.0
|
36
51
|
end
|
37
52
|
|
53
|
+
# Compute balanced type for binary operation
|
54
|
+
#
|
55
|
+
# @param [Class] other Other native datatype to coerce with.
|
56
|
+
#
|
57
|
+
# @return [Class] Result of coercion.
|
58
|
+
#
|
59
|
+
# @private
|
38
60
|
def coercion( other )
|
39
61
|
if other < FLOAT_
|
40
62
|
Hornetseye::FLOAT( ( double or other.double ) )
|
@@ -45,6 +67,13 @@ module Hornetseye
|
|
45
67
|
end
|
46
68
|
end
|
47
69
|
|
70
|
+
# Type coercion for native elements
|
71
|
+
#
|
72
|
+
# @param [Class] other Other type to coerce with.
|
73
|
+
#
|
74
|
+
# @return [Array<Class>] Result of coercion.
|
75
|
+
#
|
76
|
+
# @private
|
48
77
|
def coerce( other )
|
49
78
|
if other < FLOAT_
|
50
79
|
return other, self
|
@@ -55,63 +84,118 @@ module Hornetseye
|
|
55
84
|
end
|
56
85
|
end
|
57
86
|
|
87
|
+
# Convert to type based on floating point numbers
|
88
|
+
#
|
89
|
+
# @return [Class] Corresponding type based on floating point numbers.
|
90
|
+
#
|
91
|
+
# @private
|
58
92
|
def float
|
59
93
|
self
|
60
94
|
end
|
61
95
|
|
96
|
+
# Directive for packing/unpacking elements of this type
|
97
|
+
#
|
98
|
+
# @return [String] Returns 'f' or 'd'.
|
99
|
+
#
|
100
|
+
# @private
|
62
101
|
def directive
|
63
102
|
double ? 'd' : 'f'
|
64
103
|
end
|
65
104
|
|
105
|
+
# Return string with information about this class.
|
106
|
+
#
|
107
|
+
# @return [String] Returns a string (e.g. "SFLOAT").
|
66
108
|
def inspect
|
67
109
|
"#{ double ? 'D' : 'S' }FLOAT"
|
68
110
|
end
|
69
111
|
|
112
|
+
# Get unique descriptor of this class
|
113
|
+
#
|
114
|
+
# @param [Hash] hash Labels for any variables.
|
115
|
+
#
|
116
|
+
# @return [String] Descriptor of this class.
|
117
|
+
#
|
118
|
+
# @private
|
70
119
|
def descriptor( hash )
|
71
120
|
inspect
|
72
121
|
end
|
73
122
|
|
123
|
+
# Test equality of classes
|
124
|
+
#
|
125
|
+
# @param [Object] other Object to compare with.
|
126
|
+
#
|
127
|
+
# @return [Boolean] Boolean indicating whether classes are equal.
|
74
128
|
def ==( other )
|
75
129
|
other.is_a? Class and other < FLOAT_ and double == other.double
|
76
130
|
end
|
77
131
|
|
132
|
+
# Compute hash value for this class.
|
133
|
+
#
|
134
|
+
# @return [Fixnum] Hash value
|
135
|
+
#
|
136
|
+
# @private
|
78
137
|
def hash
|
79
138
|
[ :FLOAT_, double ].hash
|
80
139
|
end
|
81
140
|
|
141
|
+
# Equality for hash operations
|
142
|
+
#
|
143
|
+
# @param [Object] other Object to compare with.
|
144
|
+
#
|
145
|
+
# @return [Boolean] Returns +true+ if objects are equal.
|
146
|
+
#
|
147
|
+
# @private
|
82
148
|
def eql?( other )
|
83
149
|
self == other
|
84
150
|
end
|
85
151
|
|
86
152
|
end
|
87
153
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
154
|
+
module Match
|
155
|
+
|
156
|
+
# Method for matching elements of type FLOAT_
|
157
|
+
#
|
158
|
+
# @param [Array<Object>] *values Values to find matching native element
|
159
|
+
# type for.
|
160
|
+
#
|
161
|
+
# @return [Class] Native type fitting all values.
|
162
|
+
#
|
163
|
+
# @see FLOAT_
|
164
|
+
#
|
165
|
+
# @private
|
166
|
+
def fit( *values )
|
167
|
+
if values.all? { |value| value.is_a? Float or value.is_a? Integer }
|
168
|
+
if values.any? { |value| value.is_a? Float }
|
169
|
+
DFLOAT
|
170
|
+
else
|
171
|
+
super *values
|
172
|
+
end
|
96
173
|
else
|
97
174
|
super *values
|
98
175
|
end
|
99
|
-
else
|
100
|
-
super *values
|
101
176
|
end
|
102
|
-
end
|
103
177
|
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
178
|
+
# Perform type alignment
|
179
|
+
#
|
180
|
+
# Align this type to another. This is used to prefer single-precision
|
181
|
+
# floating point in certain cases.
|
182
|
+
#
|
183
|
+
# @param [Class] context Other type to align with.
|
184
|
+
#
|
185
|
+
# @private
|
186
|
+
def align( context )
|
187
|
+
if self < FLOAT_ and context < FLOAT_
|
188
|
+
context
|
189
|
+
else
|
190
|
+
super context
|
191
|
+
end
|
109
192
|
end
|
193
|
+
|
110
194
|
end
|
111
195
|
|
112
|
-
|
196
|
+
Node.extend Match
|
113
197
|
|
114
|
-
|
198
|
+
end
|
115
199
|
|
116
200
|
SINGLE = false
|
117
201
|
DOUBLE = true
|
@@ -127,12 +211,30 @@ module Hornetseye
|
|
127
211
|
SFLOAT = FLOAT SINGLE
|
128
212
|
DFLOAT = FLOAT DOUBLE
|
129
213
|
|
214
|
+
# Shortcut for constructor
|
215
|
+
#
|
216
|
+
# The method calls +SFLOAT.new+.
|
217
|
+
#
|
218
|
+
# @param [Float] value Floating point value.
|
219
|
+
#
|
220
|
+
# @return [SFLOAT] The wrapped floating point value.
|
221
|
+
#
|
222
|
+
# @private
|
130
223
|
def SFLOAT( value )
|
131
224
|
SFLOAT.new value
|
132
225
|
end
|
133
226
|
|
134
227
|
module_function :SFLOAT
|
135
228
|
|
229
|
+
# Shortcut for constructor
|
230
|
+
#
|
231
|
+
# The method calls +DFLOAT.new+.
|
232
|
+
#
|
233
|
+
# @param [Float] value Floating point value.
|
234
|
+
#
|
235
|
+
# @return [DFLOAT] The wrapped floating point value.
|
236
|
+
#
|
237
|
+
# @private
|
136
238
|
def DFLOAT( value )
|
137
239
|
DFLOAT.new value
|
138
240
|
end
|
@@ -21,40 +21,30 @@ module Hornetseye
|
|
21
21
|
|
22
22
|
class << self
|
23
23
|
|
24
|
-
def run(
|
24
|
+
def run( block )
|
25
25
|
keys, values, term = block.strip
|
26
|
-
labels = Hash[ *keys.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
zip( ( 0 ... retval_keys.size ).to_a ).flatten ]
|
31
|
-
method_name = ( '_' + retval_term.descriptor( retval_labels ) +
|
32
|
-
'_' + term.descriptor( labels ) ).
|
33
|
-
tr( '(),+\-*/%.@?~&|^<=>',
|
34
|
-
'0123\456789ABCDEFGH' )
|
26
|
+
labels = Hash[ *keys.zip( ( 0 ... keys.size ).to_a ).flatten ]
|
27
|
+
method_name = ( '_' + term.descriptor( labels ) ).
|
28
|
+
tr( '(),+\-*/%.@?~&|^<=>',
|
29
|
+
'0123\456789ABCDEFGH' )
|
35
30
|
unless GCCCache.respond_to? method_name
|
36
31
|
GCCContext.build do |context|
|
37
|
-
function = new context, method_name,
|
38
|
-
|
32
|
+
function = GCCFunction.new context, method_name,
|
33
|
+
*keys.collect { |var| var.meta }
|
39
34
|
Thread.current[ :function ] = function
|
40
35
|
term_subst = ( 0 ... keys.size ).collect do |i|
|
41
|
-
{ keys[i] => function.param( i
|
36
|
+
{ keys[i] => function.param( i ) }
|
42
37
|
end.inject( {} ) { |a,b| a.merge b }
|
43
|
-
retval_subst = ( 0 ... retval_keys.size ).collect do |i|
|
44
|
-
{ retval_keys[ i ] => function.param( i ) }
|
45
|
-
end.inject( {} ) { |a,b| a.merge b }
|
46
|
-
# Thread.current[ :function ] = function
|
47
38
|
Hornetseye::lazy do
|
48
|
-
|
39
|
+
term.subst( term_subst ).demand
|
49
40
|
end
|
50
41
|
Thread.current[ :function ] = nil
|
51
42
|
function.insn_return
|
52
43
|
function.compile
|
53
44
|
end
|
54
45
|
end
|
55
|
-
args =
|
46
|
+
args = values.collect { |arg| arg.values }.flatten
|
56
47
|
GCCCache.send method_name, *args
|
57
|
-
retval.simplify
|
58
48
|
end
|
59
49
|
|
60
50
|
end
|
@@ -81,7 +71,7 @@ module Hornetseye
|
|
81
71
|
|
82
72
|
def variable( typecode, prefix )
|
83
73
|
retval = GCCValue.new( self, id( prefix ) )
|
84
|
-
self << "#{indent}#{GCCType.new( typecode ).
|
74
|
+
self << "#{indent}#{GCCType.new( typecode ).identifier} #{retval};\n"
|
85
75
|
retval
|
86
76
|
end
|
87
77
|
|
data/lib/multiarray/gcctype.rb
CHANGED
@@ -23,41 +23,47 @@ module Hornetseye
|
|
23
23
|
@typecode = typecode
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
26
|
+
def identifier
|
27
27
|
case @typecode
|
28
28
|
when nil
|
29
|
-
|
29
|
+
'void'
|
30
30
|
when BOOL
|
31
|
-
|
31
|
+
'char'
|
32
32
|
when BYTE
|
33
|
-
|
33
|
+
'char'
|
34
34
|
when UBYTE
|
35
|
-
|
35
|
+
'unsigned char'
|
36
36
|
when SINT
|
37
|
-
|
37
|
+
'short int'
|
38
38
|
when USINT
|
39
|
-
|
39
|
+
'unsigned short int'
|
40
40
|
when INT
|
41
|
-
|
41
|
+
'int'
|
42
42
|
when UINT
|
43
|
-
|
43
|
+
'unsigned int'
|
44
44
|
when SFLOAT
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
'float'
|
46
|
+
when DFLOAT
|
47
|
+
'double'
|
48
48
|
else
|
49
49
|
if @typecode < Pointer_
|
50
|
-
|
50
|
+
'void *'
|
51
51
|
elsif @typecode < INDEX_
|
52
|
-
|
53
|
-
elsif @typecode < Composite
|
54
|
-
GCCType.new( @typecode.element_type ).identifiers * @typecode.num_elements
|
52
|
+
'int'
|
55
53
|
else
|
56
54
|
raise "No identifier available for #{@typecode.inspect}"
|
57
55
|
end
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
59
|
+
def identifiers
|
60
|
+
if @typecode < Composite
|
61
|
+
GCCType.new( @typecode.element_type ).identifiers * @typecode.num_elements
|
62
|
+
else
|
63
|
+
[ GCCType.new( @typecode ).identifier ]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
61
67
|
def r2c
|
62
68
|
case @typecode
|
63
69
|
when BOOL
|
@@ -68,7 +74,7 @@ module Hornetseye
|
|
68
74
|
[ lambda { |expr| "NUM2DBL( #{expr} )" } ]
|
69
75
|
else
|
70
76
|
if @typecode < Pointer_
|
71
|
-
[ lambda { |expr| "(#{
|
77
|
+
[ lambda { |expr| "(#{identifier})mallocToPtr( #{expr} )" } ]
|
72
78
|
elsif @typecode < Composite
|
73
79
|
GCCType.new( @typecode.element_type ).r2c * @typecode.num_elements
|
74
80
|
else
|