@@ -8,7 +8,11 @@ Authors: $(HTTP erdani.com, Andrei Alexandrescu) (original Phobos code), Ilya Ya
88 */
99module mir.algorithm.setops ;
1010
11+ import core.lifetime : move;
1112import mir.functional: naryFun;
13+ import mir.primitives;
14+ import mir.qualifier;
15+ import std.range.primitives : isRandomAccessRange;
1216
1317/**
1418Merges 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
4347duplicate in between calls).
4448 */
4549struct MultiwayMerge (alias less, RangeOfRanges)
50+ if (isRandomAccessRange! RangeOfRanges)
4651{
4752 import mir.primitives;
4853 import mir.container.binaryheap;
@@ -66,12 +71,22 @@ struct MultiwayMerge(alias less, RangeOfRanges)
6671 // /
6772 this (RangeOfRanges ror)
6873 {
69- import std.algorithm.mutation : remove, SwapStrategy;
70-
7174 // Preemptively get rid of all empty ranges in the input
7275 // 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+ }
7388 // Build the heap across the range
74- _heap = typeof (_heap)(ror.remove ! ( " a.empty " , SwapStrategy.unstable) );
89+ _heap = typeof (_heap)(ror.move );
7590 }
7691
7792 // /
@@ -100,7 +115,7 @@ MultiwayMerge!(naryFun!less, RangeOfRanges) multiwayMerge
100115(alias less = " a < b" , RangeOfRanges)
101116(RangeOfRanges ror)
102117{
103- return typeof (return )(ror);
118+ return typeof (return )(move( ror) );
104119}
105120
106121// /
@@ -152,11 +167,11 @@ auto multiwayUnion(alias less = "a < b", RangeOfRanges)(RangeOfRanges ror)
152167 import mir.functional: not;
153168 import mir.algorithm.iteration : Uniq;
154169
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) ));
156171}
157172
158173// /
159- @system version(mir_test) unittest
174+ @safe version(mir_test) unittest
160175{
161176 import std.algorithm.comparison : equal;
162177
@@ -199,10 +214,20 @@ pragma(inline, false)
199214size_t unionLength (alias less = " a < b" , RangeOfRanges)(RangeOfRanges ror)
200215{
201216 size_t length;
202- auto u = ror.multiwayUnion! less;
217+ auto u = move( ror) .multiwayUnion! less;
203218 if (! u.empty) do {
204219 length++ ;
205220 u.popFront;
206221 } while (! u.empty);
207222 return length;
208223}
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