multiarray 0.22.0 → 0.23.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/multiarray.rb +53 -16
- data/lib/multiarray/bool.rb +1 -1
- data/lib/multiarray/complex.rb +76 -68
- data/lib/multiarray/components.rb +11 -10
- data/lib/multiarray/composite.rb +1 -1
- data/lib/multiarray/diagonal.rb +11 -12
- data/lib/multiarray/element.rb +3 -3
- data/lib/multiarray/elementwise.rb +14 -14
- data/lib/multiarray/field.rb +380 -0
- data/lib/multiarray/float.rb +10 -10
- data/lib/multiarray/gcccache.rb +1 -1
- data/lib/multiarray/gcccontext.rb +35 -54
- data/lib/multiarray/gccfunction.rb +12 -19
- data/lib/multiarray/gcctype.rb +1 -1
- data/lib/multiarray/gccvalue.rb +63 -43
- data/lib/multiarray/histogram.rb +17 -19
- data/lib/multiarray/index.rb +7 -8
- data/lib/multiarray/inject.rb +11 -12
- data/lib/multiarray/int.rb +12 -11
- data/lib/multiarray/integral.rb +11 -12
- data/lib/multiarray/lambda.rb +23 -18
- data/lib/multiarray/list.rb +1 -1
- data/lib/multiarray/lookup.rb +18 -13
- data/lib/multiarray/lut.rb +13 -16
- data/lib/multiarray/malloc.rb +1 -1
- data/lib/multiarray/mask.rb +11 -8
- data/lib/multiarray/methods.rb +10 -10
- data/lib/multiarray/multiarray.rb +15 -44
- data/lib/multiarray/node.rb +64 -138
- data/lib/multiarray/object.rb +2 -6
- data/lib/multiarray/operations.rb +116 -134
- data/lib/multiarray/pointer.rb +7 -19
- data/lib/multiarray/random.rb +11 -8
- data/lib/multiarray/rgb.rb +53 -53
- data/lib/multiarray/sequence.rb +11 -496
- data/lib/multiarray/shortcuts.rb +4 -4
- data/lib/multiarray/store.rb +14 -11
- data/lib/multiarray/unmask.rb +10 -7
- data/lib/multiarray/variable.rb +11 -3
- data/test/tc_bool.rb +0 -8
- data/test/tc_compile.rb +72 -0
- data/test/tc_float.rb +0 -8
- data/test/tc_int.rb +0 -8
- data/test/tc_lazy.rb +22 -3
- data/test/tc_multiarray.rb +100 -126
- data/test/tc_object.rb +0 -16
- data/test/tc_rgb.rb +0 -16
- data/test/tc_sequence.rb +151 -165
- data/test/ts_multiarray.rb +2 -0
- metadata +7 -4
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010, 2011 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -47,6 +47,10 @@ module Hornetseye
|
|
47
47
|
dest, source, default, zero, labels, rank, n
|
48
48
|
end
|
49
49
|
|
50
|
+
def sexp?
|
51
|
+
true
|
52
|
+
end
|
53
|
+
|
50
54
|
# Get unique descriptor of this object
|
51
55
|
#
|
52
56
|
# @param [Hash] hash Labels for any variables.
|
@@ -61,15 +65,12 @@ module Hornetseye
|
|
61
65
|
"#{@n.descriptor( hash )})"
|
62
66
|
end
|
63
67
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
define_method( :array_type ) { retval }
|
71
|
-
end
|
72
|
-
retval
|
68
|
+
def typecode
|
69
|
+
@dest.typecode
|
70
|
+
end
|
71
|
+
|
72
|
+
def shape
|
73
|
+
@dest.shape
|
73
74
|
end
|
74
75
|
|
75
76
|
# Reevaluate computation
|
data/lib/multiarray/composite.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
data/lib/multiarray/diagonal.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -53,6 +53,10 @@ module Hornetseye
|
|
53
53
|
value, index0, index1, index2, initial, block, var1, var2
|
54
54
|
end
|
55
55
|
|
56
|
+
def sexp?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
56
60
|
# Get unique descriptor of this object
|
57
61
|
#
|
58
62
|
# @param [Hash] hash Labels for any variables.
|
@@ -71,17 +75,12 @@ module Hornetseye
|
|
71
75
|
"#{@block.descriptor( hash )})"
|
72
76
|
end
|
73
77
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
retval = Hornetseye::MultiArray @block.typecode, *@value.shape
|
81
|
-
( class << self; self; end ).instance_eval do
|
82
|
-
define_method( :array_type ) { retval }
|
83
|
-
end
|
84
|
-
retval
|
78
|
+
def typecode
|
79
|
+
@block.typecode
|
80
|
+
end
|
81
|
+
|
82
|
+
def shape
|
83
|
+
@value.shape
|
85
84
|
end
|
86
85
|
|
87
86
|
# Reevaluate computation
|
data/lib/multiarray/element.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -29,7 +29,7 @@ module Hornetseye
|
|
29
29
|
# @see Malloc#load
|
30
30
|
# @see List#load
|
31
31
|
def fetch( ptr )
|
32
|
-
construct *ptr.load(
|
32
|
+
construct *ptr.load(self)
|
33
33
|
end
|
34
34
|
|
35
35
|
# Construct new object from arguments
|
@@ -39,7 +39,7 @@ module Hornetseye
|
|
39
39
|
# @return [Element] New object of this type.
|
40
40
|
#
|
41
41
|
# @private
|
42
|
-
def construct(
|
42
|
+
def construct(*args)
|
43
43
|
new *args
|
44
44
|
end
|
45
45
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
-
# Copyright (C) 2010 Jan Wedekind
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
3
|
#
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
@@ -74,6 +74,10 @@ module Hornetseye
|
|
74
74
|
check_shape *values
|
75
75
|
end
|
76
76
|
|
77
|
+
def sexp?
|
78
|
+
true
|
79
|
+
end
|
80
|
+
|
77
81
|
# Get unique descriptor of this object
|
78
82
|
#
|
79
83
|
# @param [Hash] hash Labels for any variables.
|
@@ -86,18 +90,14 @@ module Hornetseye
|
|
86
90
|
"(#{@values.collect { |value| value.descriptor( hash ) }.join ','})"
|
87
91
|
end
|
88
92
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
def
|
95
|
-
|
96
|
-
|
97
|
-
( class << self; self; end ).instance_eval do
|
98
|
-
define_method( :array_type ) { retval }
|
99
|
-
end
|
100
|
-
retval
|
93
|
+
def typecode
|
94
|
+
typecodes = @values.collect { |value| value.typecode }
|
95
|
+
self.class.conversion.call *typecodes
|
96
|
+
end
|
97
|
+
|
98
|
+
def shape
|
99
|
+
shapes = @values.collect { |value| value.shape }
|
100
|
+
shapes.inject { |a,b| a.size > b.size ? a : b }
|
101
101
|
end
|
102
102
|
|
103
103
|
# Reevaluate computation
|
@@ -208,7 +208,7 @@ module Hornetseye
|
|
208
208
|
#
|
209
209
|
# @private
|
210
210
|
def compilable?
|
211
|
-
|
211
|
+
typecode.compilable? and @values.all? { |value| value.compilable? }
|
212
212
|
end
|
213
213
|
|
214
214
|
end
|
@@ -0,0 +1,380 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010, 2011 Jan Wedekind
|
3
|
+
#
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
7
|
+
# (at your option) any later version.
|
8
|
+
#
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
# GNU General Public License for more details.
|
13
|
+
#
|
14
|
+
# You should have received a copy of the GNU General Public License
|
15
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
|
17
|
+
# Namespace of Hornetseye computer vision library
|
18
|
+
module Hornetseye
|
19
|
+
|
20
|
+
# Class for representing n-dimensional native arrays
|
21
|
+
class Field_
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# Type of array elements
|
26
|
+
#
|
27
|
+
# @return [Class] Type of array elements.
|
28
|
+
attr_accessor :typecode
|
29
|
+
|
30
|
+
# Number of dimensions
|
31
|
+
#
|
32
|
+
# @return [Integer] Number of dimensions.
|
33
|
+
attr_accessor :dimension
|
34
|
+
|
35
|
+
def inherit(typecode, dimension)
|
36
|
+
retval = Class.new self
|
37
|
+
retval.typecode = typecode
|
38
|
+
retval.dimension = dimension
|
39
|
+
retval
|
40
|
+
end
|
41
|
+
|
42
|
+
def new(*shape)
|
43
|
+
options = shape.last.is_a?( Hash ) ? shape.pop : {}
|
44
|
+
raise "Constructor requires #{dimension} arguments" unless dimension == shape.size
|
45
|
+
count = options[:count] || 1
|
46
|
+
if shape.empty?
|
47
|
+
memory = options[:memory] ||
|
48
|
+
typecode.memory_type.new(typecode.storage_size * count)
|
49
|
+
Hornetseye::Pointer( typecode ).new memory
|
50
|
+
else
|
51
|
+
size = shape.pop
|
52
|
+
stride = shape.inject 1, :*
|
53
|
+
Hornetseye::lazy(size) do |index|
|
54
|
+
pointer = Field_.inherit(typecode, dimension - 1).
|
55
|
+
new *(shape + [:count => count * size, :memory => options[:memory]])
|
56
|
+
Lookup.new pointer, index, INT.new(stride)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Display this type
|
62
|
+
#
|
63
|
+
# @return [String] String with description of this type.
|
64
|
+
def inspect
|
65
|
+
if typecode and dimension
|
66
|
+
if dimension != 1
|
67
|
+
"MultiArray(#{typecode.inspect},#{dimension})"
|
68
|
+
else
|
69
|
+
"Sequence(#{typecode.inspect})"
|
70
|
+
end
|
71
|
+
else
|
72
|
+
'Field(?,?)'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_s
|
77
|
+
inspect
|
78
|
+
end
|
79
|
+
|
80
|
+
# Construct native array from Ruby array
|
81
|
+
#
|
82
|
+
# @param [Array<Object>] args Array with Ruby values.
|
83
|
+
#
|
84
|
+
# @return [Node] Native array with specified values.
|
85
|
+
def [](*args)
|
86
|
+
def arr_shape(args)
|
87
|
+
if args.is_a? Array
|
88
|
+
args.collect do |arg|
|
89
|
+
arr_shape arg
|
90
|
+
end.inject([]) do |a,b|
|
91
|
+
(0 ... [a.size, b.size].max).collect do |i|
|
92
|
+
[i < a.size ? a[i] : 0, i < b.size ? b[i] : 0].max
|
93
|
+
end
|
94
|
+
end + [args.size]
|
95
|
+
else
|
96
|
+
[]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
retval = new *arr_shape(args)
|
100
|
+
def recursion(element, args)
|
101
|
+
if element.dimension > 0
|
102
|
+
args.each_with_index do |arg,i|
|
103
|
+
recursion element.element(INT.new(i)), arg
|
104
|
+
end
|
105
|
+
else
|
106
|
+
element[] = args
|
107
|
+
end
|
108
|
+
end
|
109
|
+
recursion retval, args
|
110
|
+
retval
|
111
|
+
end
|
112
|
+
|
113
|
+
# Create (lazy) index array
|
114
|
+
#
|
115
|
+
# @overload indgen(*shape, offset = 0, increment = 1)
|
116
|
+
# @param [Array<Integer>] shape Dimensions of resulting array.
|
117
|
+
# @param [Object] offset (0) First value of array.
|
118
|
+
# @param [Object] increment (1) Increment for subsequent values.
|
119
|
+
#
|
120
|
+
# @return [Node] Lazy term generating the array.
|
121
|
+
def indgen(*args)
|
122
|
+
unless args.size.between? dimension, dimension + 2
|
123
|
+
raise "#{inspect}.indgen requires between #{dimension} and #{dimension + 2} arguments"
|
124
|
+
end
|
125
|
+
shape = args[0 ... dimension]
|
126
|
+
offset = args.size > dimension ? args[dimension] : 0
|
127
|
+
increment = args.size > dimension + 1 ? args[dimension + 1] : 1
|
128
|
+
step = shape[0 ... -1].inject 1, :*
|
129
|
+
Hornetseye::lazy(shape.last) do |i|
|
130
|
+
(step * increment * i +
|
131
|
+
Hornetseye::MultiArray(typecode, dimension - 1).
|
132
|
+
indgen(*(shape[0 ... -1] + [offset, increment]))).to_type typecode
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Generate random number array
|
137
|
+
#
|
138
|
+
# Generate integer or floating point random numbers in the range 0 ... n.
|
139
|
+
#
|
140
|
+
# @overload random(*shape, n)
|
141
|
+
# @param [Array<Integer>] shape Dimensions of resulting array.
|
142
|
+
# @param [Integer,Float] n (1) Upper boundary for random numbers
|
143
|
+
#
|
144
|
+
# @return [Node] Array with random numbers.
|
145
|
+
def random(*args)
|
146
|
+
unless args.size.between? dimension, dimension + 1
|
147
|
+
raise "#{inspect}.random requires between #{dimension} and #{dimension + 1} arguments"
|
148
|
+
end
|
149
|
+
shape = args[0 ... dimension]
|
150
|
+
n = args.size > dimension ? args[dimension] : 1
|
151
|
+
n = typecode.maxint.new n unless n.matched?
|
152
|
+
retval = new *shape
|
153
|
+
unless compilable? and dimension > 0
|
154
|
+
Random.new(retval.sexp, n).demand
|
155
|
+
else
|
156
|
+
GCCFunction.run Random.new(retval.sexp, n)
|
157
|
+
end
|
158
|
+
retval
|
159
|
+
end
|
160
|
+
|
161
|
+
# Base type of this data type
|
162
|
+
#
|
163
|
+
# @return [Class] Returns +element_type+.
|
164
|
+
#
|
165
|
+
# @private
|
166
|
+
def basetype
|
167
|
+
typecode.basetype
|
168
|
+
end
|
169
|
+
|
170
|
+
# Get storage size of array type
|
171
|
+
#
|
172
|
+
# @param [Array<Integer>] shape Shape of desired array.
|
173
|
+
#
|
174
|
+
# @return [Integer] Storage size of array.
|
175
|
+
def storage_size(*shape)
|
176
|
+
shape.inject typecode.storage_size, :*
|
177
|
+
end
|
178
|
+
|
179
|
+
# Type coercion for native elements
|
180
|
+
#
|
181
|
+
# @param [Class] other Other native datatype to coerce with.
|
182
|
+
#
|
183
|
+
# @return [Class] Result of coercion.
|
184
|
+
#
|
185
|
+
# @private
|
186
|
+
def coercion( other )
|
187
|
+
Hornetseye::MultiArray typecode.coercion(other.typecode),
|
188
|
+
[dimension, other.dimension].max
|
189
|
+
end
|
190
|
+
|
191
|
+
# Check whether delayed operation will have colour
|
192
|
+
#
|
193
|
+
# @return [Boolean] Boolean indicating whether the array has elements of type
|
194
|
+
# RGB.
|
195
|
+
def rgb?
|
196
|
+
typecode.rgb?
|
197
|
+
end
|
198
|
+
|
199
|
+
# Get this type
|
200
|
+
#
|
201
|
+
# @return [Class] Returns +self+.
|
202
|
+
#
|
203
|
+
# @private
|
204
|
+
def identity
|
205
|
+
self
|
206
|
+
end
|
207
|
+
|
208
|
+
# Get corresponding boolean type
|
209
|
+
#
|
210
|
+
# @return [Class] Returns type for array of boolean values.
|
211
|
+
#
|
212
|
+
# @private
|
213
|
+
def bool
|
214
|
+
Hornetseye::MultiArray typecode.bool, dimension
|
215
|
+
end
|
216
|
+
|
217
|
+
# Coerce and convert to boolean type
|
218
|
+
#
|
219
|
+
# @return [Class] Returns type for array of boolean values.
|
220
|
+
#
|
221
|
+
# @private
|
222
|
+
def coercion_bool(other)
|
223
|
+
coercion(other).bool
|
224
|
+
end
|
225
|
+
|
226
|
+
# Get corresponding scalar type
|
227
|
+
#
|
228
|
+
# @return [Class] Returns type for array of scalars.
|
229
|
+
#
|
230
|
+
# @private
|
231
|
+
def scalar
|
232
|
+
Hornetseye::MultiArray typecode.scalar, dimension
|
233
|
+
end
|
234
|
+
|
235
|
+
# Get corresponding floating point type
|
236
|
+
#
|
237
|
+
# @return [Class] Returns type for array of floating point numbers.
|
238
|
+
#
|
239
|
+
# @private
|
240
|
+
def float_scalar
|
241
|
+
Hornetseye::MultiArray typecode.float_scalar, dimension
|
242
|
+
end
|
243
|
+
|
244
|
+
# Get corresponding maximum integer type
|
245
|
+
#
|
246
|
+
# @return [Class] Returns type based on maximum integers.
|
247
|
+
#
|
248
|
+
# @private
|
249
|
+
def maxint
|
250
|
+
Hornetseye::MultiArray typecode.maxint, dimension
|
251
|
+
end
|
252
|
+
|
253
|
+
# Coerce and convert to maximum integer type
|
254
|
+
#
|
255
|
+
# @return [Class] Returns type based on maximum integers.
|
256
|
+
#
|
257
|
+
# @private
|
258
|
+
def coercion_maxint(other)
|
259
|
+
coercion(other).maxint
|
260
|
+
end
|
261
|
+
|
262
|
+
# Get corresponding byte type
|
263
|
+
#
|
264
|
+
# @return [Class] Returns type based on byte.
|
265
|
+
#
|
266
|
+
# @private
|
267
|
+
def byte
|
268
|
+
Hornetseye::MultiArray typecode.byte, dimension
|
269
|
+
end
|
270
|
+
|
271
|
+
# Coerce and convert to byte type
|
272
|
+
#
|
273
|
+
# @return [Class] Returns type based on byte.
|
274
|
+
#
|
275
|
+
# @private
|
276
|
+
def coercion_byte(other)
|
277
|
+
coercion(other).byte
|
278
|
+
end
|
279
|
+
|
280
|
+
# Convert to type based on floating point numbers
|
281
|
+
#
|
282
|
+
# @return [Class] Corresponding type based on floating point numbers.
|
283
|
+
#
|
284
|
+
# @private
|
285
|
+
def float
|
286
|
+
Hornetseye::MultiArray typecode.field, dimension
|
287
|
+
end
|
288
|
+
|
289
|
+
# Coerce and convert to type based on floating point numbers
|
290
|
+
#
|
291
|
+
# @return [Class] Corresponding type based on floating point numbers.
|
292
|
+
#
|
293
|
+
# @private
|
294
|
+
def floating(other)
|
295
|
+
coercion(other).float
|
296
|
+
end
|
297
|
+
|
298
|
+
# Coerce with two other types
|
299
|
+
#
|
300
|
+
# @return [Class] Result of coercion.
|
301
|
+
#
|
302
|
+
# @private
|
303
|
+
def cond(a, b)
|
304
|
+
t = a.coercion b
|
305
|
+
Hornetseye::MultiArray t.typecode, dimension
|
306
|
+
end
|
307
|
+
|
308
|
+
# Replace element type
|
309
|
+
#
|
310
|
+
# @return [Class] Result of conversion.
|
311
|
+
#
|
312
|
+
# @private
|
313
|
+
def to_type(dest)
|
314
|
+
Hornetseye::MultiArray typecode.to_type(dest), dimension
|
315
|
+
end
|
316
|
+
|
317
|
+
# Check whether this array expression allows compilation
|
318
|
+
#
|
319
|
+
# @return [Boolean] Returns +true+ if this expression supports compilation.
|
320
|
+
def compilable?
|
321
|
+
typecode.compilable?
|
322
|
+
end
|
323
|
+
|
324
|
+
end
|
325
|
+
|
326
|
+
# Namespace containing method for matching elements of type Field_
|
327
|
+
#
|
328
|
+
# @see Field_
|
329
|
+
#
|
330
|
+
# @private
|
331
|
+
module Match
|
332
|
+
|
333
|
+
# Method for matching elements of type Field_
|
334
|
+
#
|
335
|
+
# @param [Array<Object>] *values Values to find matching native element
|
336
|
+
# type for.
|
337
|
+
#
|
338
|
+
# @return [Class] Native type fitting all values.
|
339
|
+
#
|
340
|
+
# @see Field_
|
341
|
+
#
|
342
|
+
# @private
|
343
|
+
def fit( *values )
|
344
|
+
n = values.inject 0 do |size,value|
|
345
|
+
value.is_a?(Array) ? [size, value.size].max : size
|
346
|
+
end
|
347
|
+
if n > 0
|
348
|
+
elements = values.inject [] do |flat,value|
|
349
|
+
flat + (value.is_a?(Array) ? value : [value])
|
350
|
+
end
|
351
|
+
Hornetseye::MultiArray fit( *elements ), 1
|
352
|
+
else
|
353
|
+
super *values
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
# Perform type alignment
|
358
|
+
#
|
359
|
+
# Align this type to another. This is used to prefer single-precision
|
360
|
+
# floating point in certain cases.
|
361
|
+
#
|
362
|
+
# @param [Class] context Other type to align with.
|
363
|
+
#
|
364
|
+
# @private
|
365
|
+
def align(context)
|
366
|
+
if self < Field_
|
367
|
+
Hornetseye::MultiArray typecode.align(context), dimension
|
368
|
+
else
|
369
|
+
super context
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
end
|
374
|
+
|
375
|
+
Node.extend Match
|
376
|
+
|
377
|
+
end
|
378
|
+
|
379
|
+
end
|
380
|
+
|