Skip to content

Commit 0cc4701

Browse files
committed
parallelAdjacentFind. Inlinable lambda functions + a parallel find that just takes a predicate kicks ass.
1 parent 821354b commit 0cc4701

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

parallel_algorithm.d

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,34 @@ unittest {
784784
assert(parallelFind!"a == 6"(foo) == foo[7..$]);
785785
}
786786

787+
Range parallelAdjacentFind(alias pred = "a == b", Range)(
788+
Range range,
789+
size_t workUnitSize = 250,
790+
TaskPool pool = null
791+
) if(isRandomAccessRange!Range && hasLength!Range) {
792+
793+
immutable len = range.length;
794+
if(len < 2) {
795+
return range[len..len];
796+
}
797+
798+
bool nextEqual(size_t i) {
799+
assert(i < len - 1);
800+
return binaryFun!pred(range[i], range[i + 1]);
801+
}
802+
803+
auto indices = parallelFind!nextEqual(iota(len - 1), workUnitSize, pool);
804+
if(!indices.length) return range[len..len];
805+
return range[indices.front..len];
806+
}
807+
808+
unittest {
809+
auto foo = [8, 6, 7, 5, 3, 0, 9, 3, 6, 2, 4, 3, 6, 8, 8, 0, 9, 6];
810+
auto bar = iota(666);
811+
assert(parallelAdjacentFind(foo) == [8, 8, 0, 9, 6]);
812+
assert(parallelAdjacentFind(bar).empty);
813+
}
814+
787815
//////////////////////////////////////////////////////////////////////////////
788816
// Benchmarks
789817
//////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)