priority_queue_cxx17 0.3.5
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.
- checksums.yaml +7 -0
- data/README.md +295 -0
- data/ext/fast_containers/FastContainers.cpp +272 -0
- data/ext/fast_containers/extconf.rb +5 -0
- data/ext/fast_containers/fc_pq.cpp +158 -0
- data/ext/fast_containers/fc_pq.h +84 -0
- data/lib/fc.rb +32 -0
- data/test/performance/test_fc_vs_algorithms.rb +37 -0
- data/test/performance/test_fc_vs_cpriority_queue.rb +37 -0
- data/test/performance/test_fc_vs_em_priority_queue.rb +37 -0
- data/test/performance/test_fc_vs_pqueue.rb +37 -0
- data/test/performance/test_fc_vs_priority_queue.rb +37 -0
- data/test/test_fast_containers.rb +245 -0
- metadata +74 -0
@@ -0,0 +1,245 @@
|
|
1
|
+
# Copyright (c) 2014 Roberto Esposito
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
require "minitest/autorun"
|
22
|
+
require "fc"
|
23
|
+
|
24
|
+
class TestFastContainers < MiniTest::Unit::TestCase
|
25
|
+
def test_new_object_creation
|
26
|
+
assert !FastContainers::PriorityQueue.new(:max).nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_new_handling_of_bad_parameter
|
30
|
+
assert_raises(TypeError) do
|
31
|
+
FastContainers::PriorityQueue.new(true)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_push_returns_self
|
36
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
37
|
+
assert_equal pq, pq.push("test",10)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_top_on_a_single_element_queue_returns_that_element
|
41
|
+
pq = FastContainers::PriorityQueue.new(:max);
|
42
|
+
pq.push("test",10)
|
43
|
+
assert_equal "test", pq.top
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_next_on_a_single_element_queue_returns_that_element
|
47
|
+
pq = FastContainers::PriorityQueue.new(:max);
|
48
|
+
pq.push("test",10)
|
49
|
+
assert_equal "test", pq.next
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def test_top_returns_the_maximal_element_in_a_max_queue
|
54
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
55
|
+
pq.push("10", 10)
|
56
|
+
pq.push("30", 30)
|
57
|
+
pq.push("20", 20)
|
58
|
+
assert_equal "30", pq.top
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_next_returns_the_maximal_element_in_a_max_queue
|
62
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
63
|
+
pq.push("10", 10)
|
64
|
+
pq.push("30", 30)
|
65
|
+
pq.push("20", 20)
|
66
|
+
assert_equal "30", pq.next
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def test_top_returns_the_minimal_element_in_a_min_queue
|
71
|
+
pq = FastContainers::PriorityQueue.new(:min) # this is a max queue
|
72
|
+
pq.push("10", 10)
|
73
|
+
pq.push("30", 30)
|
74
|
+
pq.push("20", 20)
|
75
|
+
assert_equal "10", pq.top
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_next_returns_the_minimal_element_in_a_min_queue
|
79
|
+
pq = FastContainers::PriorityQueue.new(:min) # this is a max queue
|
80
|
+
pq.push("10", 10)
|
81
|
+
pq.push("30", 30)
|
82
|
+
pq.push("20", 20)
|
83
|
+
assert_equal "10", pq.next
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_top_key_returns_the_top_priority
|
87
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
88
|
+
pq.push("10", 10)
|
89
|
+
pq.push("30", 30)
|
90
|
+
pq.push("20", 20)
|
91
|
+
assert_equal 30, pq.top_key
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_next_key_returns_the_top_priority
|
95
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
96
|
+
pq.push("10", 10)
|
97
|
+
pq.push("30", 30)
|
98
|
+
pq.push("20", 20)
|
99
|
+
assert_equal 30, pq.next_key
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def test_pop_removes_an_element_from_the_top
|
104
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
105
|
+
pq.push("10", 10)
|
106
|
+
pq.push("30", 30)
|
107
|
+
pq.push("20", 20)
|
108
|
+
extracted = pq.pop
|
109
|
+
|
110
|
+
assert_equal 20, pq.top_key
|
111
|
+
assert_equal "30", extracted
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_pop_raises_an_exception_if_the_queue_is_empty
|
115
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
116
|
+
pq.push("10", 10)
|
117
|
+
pq.pop
|
118
|
+
assert_raises(RuntimeError) {
|
119
|
+
pq.pop
|
120
|
+
}
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_empty_returns_false_if_the_queue_is_not_empty
|
124
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
125
|
+
pq.push("10", 10)
|
126
|
+
assert !pq.empty?
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_empty_returns_true_if_the_queue_is_empty
|
130
|
+
pq = FastContainers::PriorityQueue.new(:max) # this is a max queue
|
131
|
+
assert pq.empty?
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_size_on_empty_queue
|
135
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
136
|
+
assert_equal 0, pq.size
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_size_on_non_empty_queue
|
140
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
141
|
+
pq.push("x",10);
|
142
|
+
pq.push("y",20);
|
143
|
+
pq.push("z",30);
|
144
|
+
assert_equal 3, pq.size
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_enumerable
|
148
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
149
|
+
pq.push(1,10);
|
150
|
+
pq.push(2,20);
|
151
|
+
pq.push(3,30);
|
152
|
+
sum_o = 0
|
153
|
+
sum_p = 0
|
154
|
+
pq.map { |o,p| sum_o+=o; sum_p+=p }
|
155
|
+
assert_equal 6, sum_o
|
156
|
+
assert_equal 60, sum_p
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_top_key_on_empty_queues
|
160
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
161
|
+
assert_nil pq.top_key
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_top_on_empty_queues
|
165
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
166
|
+
assert_nil pq.top
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_second_best_key
|
170
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
171
|
+
pq.push("x", 100);
|
172
|
+
pq.push("y", 80);
|
173
|
+
pq.push("z", 40);
|
174
|
+
pq.push("w", 60);
|
175
|
+
pq.push("i", 90);
|
176
|
+
pq.push("j", 95);
|
177
|
+
|
178
|
+
assert_equal pq.second_best_key, 95
|
179
|
+
end
|
180
|
+
|
181
|
+
def test_second_best_key_on_empty_pq
|
182
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
183
|
+
assert_nil pq.second_best_key
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_second_best_key_on_size_1_pq
|
187
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
188
|
+
pq.push("x", 100)
|
189
|
+
assert_nil pq.second_best_key
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_second_best_key_on_size_2_pq
|
193
|
+
pq = FastContainers::PriorityQueue.new(:max)
|
194
|
+
pq.push("x", 100)
|
195
|
+
pq.push("x", 80)
|
196
|
+
|
197
|
+
assert_equal 80, pq.second_best_key
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_each_will_iterate_over_all_elements
|
201
|
+
pq = FastContainers::PriorityQueue.new(:max);
|
202
|
+
pq.push("x", 100);
|
203
|
+
pq.push("y", 80);
|
204
|
+
pq.push("z", 40);
|
205
|
+
pq.push("w", 60);
|
206
|
+
pq.push("i", 90);
|
207
|
+
pq.push("j", 95);
|
208
|
+
|
209
|
+
objects = Set.new
|
210
|
+
|
211
|
+
result = pq.each do |obj, priority|
|
212
|
+
objects << obj
|
213
|
+
end
|
214
|
+
|
215
|
+
assert_equal objects, Set.new(["x","y","z","w","i","j"])
|
216
|
+
assert_equal pq, result
|
217
|
+
end
|
218
|
+
|
219
|
+
def test_each_will_abort_and_return_nil_if_queue_changes
|
220
|
+
pq = FastContainers::PriorityQueue.new(:max);
|
221
|
+
pq.push("x", 100);
|
222
|
+
pq.push("y", 80);
|
223
|
+
pq.push("z", 40);
|
224
|
+
pq.push("w", 60);
|
225
|
+
pq.push("i", 90);
|
226
|
+
pq.push("j", 95);
|
227
|
+
|
228
|
+
objects = Set.new
|
229
|
+
|
230
|
+
exception = assert_raises RuntimeError do
|
231
|
+
count = 0
|
232
|
+
pq.each do |obj, priority|
|
233
|
+
if count==3
|
234
|
+
pq.push("no way!", 90)
|
235
|
+
end
|
236
|
+
|
237
|
+
count+=1
|
238
|
+
objects << obj
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
assert_match /a change in the priority queue invalidated the current iterator/, exception.message
|
243
|
+
assert_equal 4, objects.size
|
244
|
+
end
|
245
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: priority_queue_cxx17
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Roberto Esposito, Hugo Jiménez Hernández
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-08-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake-compiler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Fast priority queue implementation (c++ wrapper, see README.md for a
|
28
|
+
comparison with other libraries)
|
29
|
+
email:
|
30
|
+
- boborbt@gmail.com, hjimenezhdez@gmail.com
|
31
|
+
executables: []
|
32
|
+
extensions:
|
33
|
+
- ext/fast_containers/extconf.rb
|
34
|
+
extra_rdoc_files:
|
35
|
+
- README.md
|
36
|
+
files:
|
37
|
+
- README.md
|
38
|
+
- ext/fast_containers/FastContainers.cpp
|
39
|
+
- ext/fast_containers/extconf.rb
|
40
|
+
- ext/fast_containers/fc_pq.cpp
|
41
|
+
- ext/fast_containers/fc_pq.h
|
42
|
+
- lib/fc.rb
|
43
|
+
- test/performance/test_fc_vs_algorithms.rb
|
44
|
+
- test/performance/test_fc_vs_cpriority_queue.rb
|
45
|
+
- test/performance/test_fc_vs_em_priority_queue.rb
|
46
|
+
- test/performance/test_fc_vs_pqueue.rb
|
47
|
+
- test/performance/test_fc_vs_priority_queue.rb
|
48
|
+
- test/test_fast_containers.rb
|
49
|
+
homepage: https://github.com/HugoJH/priority_queue_cxx
|
50
|
+
licenses:
|
51
|
+
- MIT
|
52
|
+
metadata: {}
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options:
|
55
|
+
- "--main"
|
56
|
+
- README.md
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubygems_version: 3.0.3
|
71
|
+
signing_key:
|
72
|
+
specification_version: 4
|
73
|
+
summary: Fast (c++ wrapper) priority queue implementation for ruby.
|
74
|
+
test_files: []
|