@@ -8,7 +8,11 @@ Authors: $(HTTP erdani.com, Andrei Alexandrescu) (original Phobos code), Ilya Ya
8
8
*/
9
9
module mir.algorithm.setops ;
10
10
11
+ import core.lifetime : move;
11
12
import mir.functional: naryFun;
13
+ import mir.primitives;
14
+ import mir.qualifier;
15
+ import std.range.primitives : isRandomAccessRange;
12
16
13
17
/**
14
18
Merges multiple sets. The input sets are passed as a
@@ -43,6 +47,7 @@ want to pass a duplicate to $(D MultiwayMerge) (and perhaps cache the
43
47
duplicate in between calls).
44
48
*/
45
49
struct MultiwayMerge (alias less, RangeOfRanges)
50
+ if (isRandomAccessRange! RangeOfRanges)
46
51
{
47
52
import mir.primitives;
48
53
import mir.container.binaryheap;
@@ -66,12 +71,22 @@ struct MultiwayMerge(alias less, RangeOfRanges)
66
71
// /
67
72
this (RangeOfRanges ror)
68
73
{
69
- import std.algorithm.mutation : remove, SwapStrategy;
70
-
71
74
// Preemptively get rid of all empty ranges in the input
72
75
// No need for stability either
76
+ auto temp = ror.lightScope;
77
+ for (;! temp.empty;)
78
+ {
79
+ if (! temp.empty)
80
+ {
81
+ temp.popFront;
82
+ continue ;
83
+ }
84
+ move(temp.back, temp.front);
85
+ temp.popBack;
86
+ ror.popBack;
87
+ }
73
88
// Build the heap across the range
74
- _heap = typeof (_heap)(ror.remove ! ( " a.empty " , SwapStrategy.unstable) );
89
+ _heap = typeof (_heap)(ror.move );
75
90
}
76
91
77
92
// /
@@ -100,7 +115,7 @@ MultiwayMerge!(naryFun!less, RangeOfRanges) multiwayMerge
100
115
(alias less = " a < b" , RangeOfRanges)
101
116
(RangeOfRanges ror)
102
117
{
103
- return typeof (return )(ror);
118
+ return typeof (return )(move( ror) );
104
119
}
105
120
106
121
// /
@@ -152,11 +167,11 @@ auto multiwayUnion(alias less = "a < b", RangeOfRanges)(RangeOfRanges ror)
152
167
import mir.functional: not;
153
168
import mir.algorithm.iteration : Uniq;
154
169
155
- return Uniq! (not! less, typeof (multiwayMerge! less(ror)))(multiwayMerge! less(ror));
170
+ return Uniq! (not! less, typeof (multiwayMerge! less(ror)))(multiwayMerge! less(move( ror) ));
156
171
}
157
172
158
173
// /
159
- @system version(mir_test) unittest
174
+ @safe version(mir_test) unittest
160
175
{
161
176
import std.algorithm.comparison : equal;
162
177
@@ -199,10 +214,20 @@ pragma(inline, false)
199
214
size_t unionLength (alias less = " a < b" , RangeOfRanges)(RangeOfRanges ror)
200
215
{
201
216
size_t length;
202
- auto u = ror.multiwayUnion! less;
217
+ auto u = move( ror) .multiwayUnion! less;
203
218
if (! u.empty) do {
204
219
length++ ;
205
220
u.popFront;
206
221
} while (! u.empty);
207
222
return length;
208
223
}
224
+
225
+ /+ +
226
+ +/
227
+ auto rcunion (alias less = " a < b" , RangeOfRanges)(RangeOfRanges ror)
228
+ {
229
+ import mir.rc.array;
230
+ auto length = unionLength! less(ror.lightScope);
231
+ auto u = multiwayUnion! less(ror.move);
232
+
233
+ }
0 commit comments