multiarray 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +1 -1
- data/README.md +3 -0
- data/Rakefile +7 -6
- data/TODO +79 -2
- data/lib/multiarray.rb +452 -31
- data/lib/multiarray/binary.rb +174 -0
- data/lib/multiarray/bool.rb +138 -0
- data/lib/multiarray/diagonal.rb +167 -0
- data/lib/multiarray/element.rb +146 -0
- data/lib/multiarray/gcccache.rb +23 -0
- data/lib/multiarray/gcccontext.rb +144 -0
- data/lib/multiarray/gccfunction.rb +109 -0
- data/lib/multiarray/gcctype.rb +73 -0
- data/lib/multiarray/gccvalue.rb +152 -0
- data/lib/multiarray/index.rb +91 -0
- data/lib/multiarray/inject.rb +143 -0
- data/lib/multiarray/int.rb +238 -13
- data/lib/multiarray/lambda.rb +100 -0
- data/lib/multiarray/list.rb +27 -50
- data/lib/multiarray/lookup.rb +85 -0
- data/lib/multiarray/malloc.rb +28 -2
- data/lib/multiarray/multiarray.rb +44 -30
- data/lib/multiarray/node.rb +596 -0
- data/lib/multiarray/object.rb +74 -31
- data/lib/multiarray/operations.rb +78 -0
- data/lib/multiarray/pointer.rb +134 -4
- data/lib/multiarray/sequence.rb +209 -38
- data/lib/multiarray/unary.rb +170 -0
- data/lib/multiarray/variable.rb +120 -0
- data/test/tc_bool.rb +117 -0
- data/test/tc_int.rb +122 -85
- data/test/tc_multiarray.rb +196 -55
- data/test/tc_object.rb +54 -49
- data/test/tc_sequence.rb +177 -83
- data/test/ts_multiarray.rb +17 -0
- metadata +40 -16
- data/README +0 -1
- data/lib/multiarray/int_.rb +0 -198
- data/lib/multiarray/lazy.rb +0 -81
- data/lib/multiarray/pointer_.rb +0 -260
- data/lib/multiarray/sequence_.rb +0 -155
- data/lib/multiarray/type.rb +0 -207
@@ -0,0 +1,170 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010 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 unary operations on scalars and arrays
|
21
|
+
class Unary_ < Node
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# Name of operation
|
26
|
+
#
|
27
|
+
# @return [Symbol,String] The name of this operation.
|
28
|
+
attr_accessor :operation
|
29
|
+
|
30
|
+
# Name of method for type conversion
|
31
|
+
#
|
32
|
+
# @return [Symbol,String] The name of the method for type conversion.
|
33
|
+
attr_accessor :conversion
|
34
|
+
|
35
|
+
# Get string with information about this class
|
36
|
+
#
|
37
|
+
# @return [String] Return string with information about this class.
|
38
|
+
def inspect
|
39
|
+
operation.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
# Get unique descriptor of this class
|
43
|
+
#
|
44
|
+
# @param [Hash] hash Labels for any variables.
|
45
|
+
#
|
46
|
+
# @return [String] Descriptor of this class.
|
47
|
+
#
|
48
|
+
# @private
|
49
|
+
def descriptor( hash )
|
50
|
+
operation.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
# Initialise unary operation
|
56
|
+
#
|
57
|
+
# @param [Node] value Value to apply operation to.
|
58
|
+
def initialize( value )
|
59
|
+
@value = value
|
60
|
+
end
|
61
|
+
|
62
|
+
# Get unique descriptor of this object
|
63
|
+
#
|
64
|
+
# @param [Hash] hash Labels for any variables.
|
65
|
+
#
|
66
|
+
# @return [String] Descriptor of this object,
|
67
|
+
#
|
68
|
+
# @private
|
69
|
+
def descriptor( hash )
|
70
|
+
"(#{@value.descriptor( hash )}).#{self.class.descriptor( hash )}"
|
71
|
+
end
|
72
|
+
|
73
|
+
# Array type of this term
|
74
|
+
#
|
75
|
+
# @return [Class] Resulting array type.
|
76
|
+
#
|
77
|
+
# @private
|
78
|
+
def array_type
|
79
|
+
@value.array_type.send self.class.conversion
|
80
|
+
end
|
81
|
+
|
82
|
+
# Substitute variables
|
83
|
+
#
|
84
|
+
# Substitute the variables with the values given in the hash.
|
85
|
+
#
|
86
|
+
# @param [Hash] hash Substitutions to apply.
|
87
|
+
#
|
88
|
+
# @return [Node] Term with substitutions applied.
|
89
|
+
#
|
90
|
+
# @private
|
91
|
+
def subst( hash )
|
92
|
+
self.class.new @value.subst( hash )
|
93
|
+
end
|
94
|
+
|
95
|
+
# Get variables contained in this term
|
96
|
+
#
|
97
|
+
# @return [Set] Returns set of variables.
|
98
|
+
#
|
99
|
+
# @private
|
100
|
+
def variables
|
101
|
+
@value.variables
|
102
|
+
end
|
103
|
+
|
104
|
+
# Strip of all values
|
105
|
+
#
|
106
|
+
# Split up into variables, values, and a term where all values have been
|
107
|
+
# replaced with variables.
|
108
|
+
#
|
109
|
+
# @return [Array<Array,Node>] Returns an array of variables, an array of
|
110
|
+
# values, and the term based on variables.
|
111
|
+
#
|
112
|
+
# @private
|
113
|
+
def strip
|
114
|
+
vars, values, term = @value.strip
|
115
|
+
return vars, values, self.class.new( term )
|
116
|
+
end
|
117
|
+
|
118
|
+
# Reevaluate computation
|
119
|
+
#
|
120
|
+
# @return [Node,Object] Result of computation
|
121
|
+
#
|
122
|
+
# @see #force
|
123
|
+
#
|
124
|
+
# @private
|
125
|
+
def demand
|
126
|
+
@value.send self.class.operation
|
127
|
+
end
|
128
|
+
|
129
|
+
# Get element of unary operation
|
130
|
+
#
|
131
|
+
# @param [Integer,Node] i Index of desired element.
|
132
|
+
#
|
133
|
+
# @return [Node,Object] Element of unary operation.
|
134
|
+
def element( i )
|
135
|
+
@value.element( i ).send self.class.operation
|
136
|
+
end
|
137
|
+
|
138
|
+
# Check whether this term is compilable
|
139
|
+
#
|
140
|
+
# @return [FalseClass,TrueClass] Returns whether this term is compilable.
|
141
|
+
#
|
142
|
+
# @private
|
143
|
+
def compilable?
|
144
|
+
@value.compilable?
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
# Create a class deriving from +Unary_+
|
150
|
+
#
|
151
|
+
# @param [Symbol,String] operation Name of operation.
|
152
|
+
# @param [Symbol,String] conversion Name of method for type conversion.
|
153
|
+
#
|
154
|
+
# @return [Class] A class deriving from +Unary_+.
|
155
|
+
#
|
156
|
+
# @see Unary_
|
157
|
+
# @see Unary_.operation
|
158
|
+
# @see Unary_.conversion
|
159
|
+
#
|
160
|
+
# @private
|
161
|
+
def Unary( operation, conversion = :contiguous )
|
162
|
+
retval = Class.new Unary_
|
163
|
+
retval.operation = operation
|
164
|
+
retval.conversion = conversion
|
165
|
+
retval
|
166
|
+
end
|
167
|
+
|
168
|
+
module_function :Unary
|
169
|
+
|
170
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010 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 Variable < Node
|
21
|
+
|
22
|
+
# Type information about this variable
|
23
|
+
#
|
24
|
+
# @return [Class] Returns type information about this variable.
|
25
|
+
attr_reader :meta
|
26
|
+
|
27
|
+
def initialize( meta )
|
28
|
+
@meta = meta
|
29
|
+
end
|
30
|
+
|
31
|
+
def inspect
|
32
|
+
"Variable(#{@meta.inspect})"
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get unique descriptor of this object
|
36
|
+
#
|
37
|
+
# @param [Hash] hash Labels for any variables.
|
38
|
+
#
|
39
|
+
# @return [String] Descriptor of this object,
|
40
|
+
#
|
41
|
+
# @private
|
42
|
+
def descriptor( hash )
|
43
|
+
if hash[ self ]
|
44
|
+
"Variable#{hash[ self ]}(#{@meta.descriptor( hash )})"
|
45
|
+
else
|
46
|
+
"Variable(#{@meta.descriptor( hash )})"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def size
|
51
|
+
@meta.size
|
52
|
+
end
|
53
|
+
|
54
|
+
def size=( value )
|
55
|
+
@meta.size = value
|
56
|
+
end
|
57
|
+
|
58
|
+
def array_type
|
59
|
+
@meta.array_type
|
60
|
+
end
|
61
|
+
|
62
|
+
# Strip of all values
|
63
|
+
#
|
64
|
+
# Split up into variables, values, and a term where all values have been
|
65
|
+
# replaced with variables.
|
66
|
+
#
|
67
|
+
# @return [Array<Array,Node>] Returns an array of variables, an array of
|
68
|
+
# values, and the term based on variables.
|
69
|
+
#
|
70
|
+
# @private
|
71
|
+
def strip
|
72
|
+
meta_vars, meta_values, meta_term = @meta.strip
|
73
|
+
if meta_vars.empty?
|
74
|
+
return [], [], self
|
75
|
+
else
|
76
|
+
return meta_vars, meta_values, Variable.new( meta_term )
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Substitute variables
|
81
|
+
#
|
82
|
+
# Substitute the variables with the values given in the hash.
|
83
|
+
#
|
84
|
+
# @param [Hash] hash Substitutions to apply.
|
85
|
+
#
|
86
|
+
# @return [Node] Term with substitutions applied.
|
87
|
+
#
|
88
|
+
# @private
|
89
|
+
def subst( hash )
|
90
|
+
if hash[ self ]
|
91
|
+
hash[ self ]
|
92
|
+
elsif not @meta.variables.empty? and hash[ @meta.variables.to_a.first ]
|
93
|
+
Variable.new @meta.subst( hash )
|
94
|
+
else
|
95
|
+
self
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Get variables contained in this object
|
100
|
+
#
|
101
|
+
# @return [Set] Returns +Set[ self ]+.
|
102
|
+
#
|
103
|
+
# @private
|
104
|
+
def variables
|
105
|
+
Set[ self ]
|
106
|
+
end
|
107
|
+
|
108
|
+
# Lookup element of an array
|
109
|
+
#
|
110
|
+
# @param [Node] value Index of element.
|
111
|
+
# @param [Node] stride Stride for iterating over elements.
|
112
|
+
#
|
113
|
+
# @private
|
114
|
+
def lookup( value, stride )
|
115
|
+
Lookup.new self, value, stride
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
data/test/tc_bool.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010 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
|
+
require 'test/unit'
|
18
|
+
begin
|
19
|
+
require 'rubygems'
|
20
|
+
rescue LoadError
|
21
|
+
end
|
22
|
+
Kernel::require 'multiarray'
|
23
|
+
|
24
|
+
class TC_Bool < Test::Unit::TestCase
|
25
|
+
|
26
|
+
B = Hornetseye::BOOL
|
27
|
+
|
28
|
+
def setup
|
29
|
+
end
|
30
|
+
|
31
|
+
def teardown
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_bool_inspect
|
35
|
+
assert_equal 'BOOL', B.inspect
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_bool_to_s
|
39
|
+
assert_equal 'BOOL', B.to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_bool_default
|
43
|
+
assert_equal false, B.new[]
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_bool_typecode
|
47
|
+
assert_equal B, B.typecode
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_bool_dimension
|
51
|
+
assert_equal 0, B.dimension
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_bool_shape
|
55
|
+
assert_equal [], B.shape
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_inspect
|
59
|
+
assert_equal 'BOOL(true)', B.new( true ).inspect
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_marshal
|
63
|
+
assert_equal B.new( true ), Marshal.load( Marshal.dump( B.new( true ) ) )
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_typecode
|
67
|
+
assert_equal B, B.new.typecode
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_dimension
|
71
|
+
assert_equal 0, B.new.dimension
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_shape
|
75
|
+
assert_equal [], B.new.shape
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_at_assign
|
79
|
+
b = B.new false
|
80
|
+
assert !b[]
|
81
|
+
assert b[] = true
|
82
|
+
assert b[]
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_equal
|
86
|
+
assert_equal B.new( false ), B.new( false )
|
87
|
+
assert_not_equal B.new( false ), B.new( true )
|
88
|
+
assert_not_equal B.new( true ), B.new( false )
|
89
|
+
assert_equal B.new( true ), B.new( true )
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_inject
|
93
|
+
assert B.new( true ).inject { |a,b| a.and b }[]
|
94
|
+
assert !B.new( false ).inject( true ) { |a,b| a.and b }[]
|
95
|
+
assert !B.new( true ).inject( false ) { |a,b| a.and b }[]
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_not
|
99
|
+
assert_equal B.new( true ), B.new( false ).not
|
100
|
+
assert_equal B.new( false ), B.new( true ).not
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_and
|
104
|
+
assert_equal B.new( false ), B.new( false ).and( B.new( false ) )
|
105
|
+
assert_equal B.new( false ), B.new( false ).and( B.new( true ) )
|
106
|
+
assert_equal B.new( false ), B.new( true ).and( B.new( false ) )
|
107
|
+
assert_equal B.new( true ), B.new( true ).and( B.new( true ) )
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_or
|
111
|
+
assert_equal B.new( false ), B.new( false ).or( B.new( false ) )
|
112
|
+
assert_equal B.new( true ), B.new( false ).or( B.new( true ) )
|
113
|
+
assert_equal B.new( true ), B.new( true ).or( B.new( false ) )
|
114
|
+
assert_equal B.new( true ), B.new( true ).or( B.new( true ) )
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
data/test/tc_int.rb
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# multiarray - Lazy multi-dimensional arrays for Ruby
|
2
|
+
# Copyright (C) 2010 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
|
+
|
1
17
|
require 'test/unit'
|
2
18
|
begin
|
3
19
|
require 'rubygems'
|
@@ -7,33 +23,24 @@ Kernel::require 'multiarray'
|
|
7
23
|
|
8
24
|
class TC_Int < Test::Unit::TestCase
|
9
25
|
|
10
|
-
|
11
|
-
|
26
|
+
I = Hornetseye::INT
|
27
|
+
U8 = Hornetseye::UBYTE
|
28
|
+
S8 = Hornetseye::BYTE
|
12
29
|
U16 = Hornetseye::USINT
|
13
30
|
S16 = Hornetseye::SINT
|
14
31
|
U32 = Hornetseye::UINT
|
15
32
|
S32 = Hornetseye::INT
|
16
|
-
U64 = Hornetseye::ULONG
|
17
|
-
S64 = Hornetseye::LONG
|
18
33
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
U16 => 'USINT', S16 => 'SINT',
|
23
|
-
U32 => 'UINT', S32 => 'INT'
|
24
|
-
}
|
25
|
-
SIGNED = {
|
26
|
-
U8 => false, S8 => true,
|
27
|
-
U16 => false, S16 => true,
|
28
|
-
U32 => false, S32 => true
|
29
|
-
}
|
34
|
+
def UI( bits )
|
35
|
+
Hornetseye::INT Hornetseye::UNSIGNED, bits
|
36
|
+
end
|
30
37
|
|
31
|
-
def
|
32
|
-
Hornetseye::
|
38
|
+
def SI( bits )
|
39
|
+
Hornetseye::INT Hornetseye::SIGNED, bits
|
33
40
|
end
|
34
41
|
|
35
|
-
def
|
36
|
-
Hornetseye::
|
42
|
+
def sum( *args, &action )
|
43
|
+
Hornetseye::sum *args, &action
|
37
44
|
end
|
38
45
|
|
39
46
|
def setup
|
@@ -42,97 +49,127 @@ class TC_Int < Test::Unit::TestCase
|
|
42
49
|
def teardown
|
43
50
|
end
|
44
51
|
|
52
|
+
def test_int_inspect
|
53
|
+
assert_equal 'UBYTE', U8.inspect
|
54
|
+
assert_equal 'BYTE', S8.inspect
|
55
|
+
assert_equal 'USINT', U16.inspect
|
56
|
+
assert_equal 'SINT', S16.inspect
|
57
|
+
assert_equal 'UINT', U32.inspect
|
58
|
+
assert_equal 'INT', S32.inspect
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_int_to_s
|
62
|
+
assert_equal 'UBYTE', U8.to_s
|
63
|
+
assert_equal 'BYTE', S8.to_s
|
64
|
+
assert_equal 'USINT', U16.to_s
|
65
|
+
assert_equal 'SINT', S16.to_s
|
66
|
+
assert_equal 'UINT', U32.to_s
|
67
|
+
assert_equal 'INT', S32.to_s
|
68
|
+
end
|
69
|
+
|
45
70
|
def test_int_default
|
46
|
-
|
71
|
+
assert_equal 0, I.new[]
|
47
72
|
end
|
48
73
|
|
74
|
+
def test_int_typecode
|
75
|
+
assert_equal I, I.typecode
|
76
|
+
end
|
49
77
|
|
50
|
-
def
|
51
|
-
|
78
|
+
def test_int_dimension
|
79
|
+
assert_equal 0, I.dimension
|
52
80
|
end
|
53
81
|
|
54
|
-
def
|
55
|
-
|
82
|
+
def test_int_shape
|
83
|
+
assert_equal [], I.shape
|
56
84
|
end
|
57
85
|
|
58
86
|
def test_inspect
|
59
|
-
|
87
|
+
assert_equal 'INT(42)', I.new( 42 ).inspect
|
60
88
|
end
|
61
89
|
|
62
|
-
def
|
63
|
-
|
90
|
+
def test_marshal
|
91
|
+
assert_equal I.new( 42 ), Marshal.load( Marshal.dump( I.new( 42 ) ) )
|
64
92
|
end
|
65
93
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
94
|
+
def test_typecode
|
95
|
+
assert_equal I, I.new.typecode
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_dimension
|
99
|
+
assert_equal 0, I.new.dimension
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_shape
|
103
|
+
assert_equal [], I.new.shape
|
71
104
|
end
|
72
105
|
|
73
106
|
def test_at_assign
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
assert_equal 42, i[]
|
79
|
-
end
|
107
|
+
i = I.new 42
|
108
|
+
assert_equal 42, i[]
|
109
|
+
assert_equal 3, i[] = 3
|
110
|
+
assert_equal 3, i[]
|
80
111
|
end
|
81
112
|
|
82
113
|
def test_equal
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
114
|
+
assert_not_equal I.new( 3 ), I.new( 4 )
|
115
|
+
assert_equal I.new( 3 ), I.new( 3 )
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_inject
|
119
|
+
assert_equal 2, I.new( 2 ).inject { |a,b| a + b }[]
|
120
|
+
assert_equal 3, I.new( 2 ).inject( 1 ) { |a,b| a + b }[]
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_not
|
124
|
+
assert !I.new( 0 ).not[]
|
125
|
+
assert !I.new( 3 ).not[]
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_sum
|
129
|
+
assert_equal 3, sum { || 3 }
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_zero
|
133
|
+
assert I.new( 0 ).zero?[]
|
134
|
+
assert !I.new( 3 ).zero?[]
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_nonzero
|
138
|
+
assert !I.new( 0 ).nonzero?[]
|
139
|
+
assert I.new( 3 ).nonzero?[]
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_bitwise_not
|
143
|
+
assert_equal I.new( -3 ), ~I.new( 2 )
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_bitwise_and
|
147
|
+
assert_equal I.new( 2 ), I.new( 3 ) & I.new( 6 )
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_bitwise_or
|
151
|
+
assert_equal I.new( 7 ), I.new( 3 ) | I.new( 6 )
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_bitwise_xor
|
155
|
+
assert_equal I.new( 1 ), I.new( 3 ) ^ I.new( 2 )
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_shl
|
159
|
+
assert_equal I.new( 4 ), I.new( 2 ) << I.new( 1 )
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_shr
|
163
|
+
assert_equal I.new( 2 ), I.new( 4 ) >> I.new( 1 )
|
89
164
|
end
|
90
165
|
|
91
166
|
def test_negate
|
92
|
-
|
93
|
-
assert_equal t.new( -5 ), -t.new( 5 )
|
94
|
-
end
|
167
|
+
assert_equal I.new( -5 ), -I.new( 5 )
|
95
168
|
end
|
96
169
|
|
97
170
|
def test_plus
|
98
|
-
|
99
|
-
T.each do |t2|
|
100
|
-
assert_equal 5, ( t1.new( 3 ) + t2.new( 2 ) )[]
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def test_lazy_unary
|
106
|
-
T.select { |t| SIGNED[ t ] }.each do |t|
|
107
|
-
i = lazy { -t.new( 3 ) }
|
108
|
-
assert_not_equal t.new( -3 ), i
|
109
|
-
assert_equal "#{t}(<delayed>)", i.inspect
|
110
|
-
assert_equal t.new( -3 ), i.force
|
111
|
-
i = lazy { --t.new( 3 ) }
|
112
|
-
assert_equal "#{t}(<delayed>)", i.inspect
|
113
|
-
assert_equal t.new( 3 ), i.force
|
114
|
-
i = -lazy { -t.new( 3 ) }
|
115
|
-
assert_equal t.new( 3 ), i
|
116
|
-
i = lazy { -lazy { -t.new( 3 ) } }
|
117
|
-
assert_equal "#{t}(<delayed>)", i.inspect
|
118
|
-
assert_equal t.new( 3 ), i.force
|
119
|
-
i = eager { lazy { -t.new( 3 ) } }
|
120
|
-
assert_equal "#{t}(<delayed>)", i.inspect
|
121
|
-
i = lazy { eager { -lazy { -t.new( 3 ) } } }
|
122
|
-
assert_equal t.new( 3 ), i
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_lazy_binary
|
127
|
-
a = U16.new 3
|
128
|
-
b = S8.new -5
|
129
|
-
i = lazy { a + b }
|
130
|
-
assert_not_equal a + b, i
|
131
|
-
assert_equal 'SINT(<delayed>)', i.inspect
|
132
|
-
assert_equal S16.new( -2 ), i.force
|
133
|
-
assert_equal S32.new( -1 ), i + S32.new( 1 )
|
134
|
-
assert_equal S32.new( -1 ), S32.new( 1 ) + i
|
171
|
+
assert_equal I.new( 3 + 5 ), I.new( 3 ) + I.new( 5 )
|
135
172
|
end
|
136
173
|
|
137
|
-
|
138
174
|
end
|
175
|
+
|