Best shuffle: Difference between revisions

Improved D version
(Improved first D version)
(Improved D version)
Line 292:
pure nothrow void bestShuffle(in char[] txt, char[] result) {
enum int NCHAR = cast(int)char.max + 1;
enum int MAX_VLA_SIZE = 1024;
const int len = txt.length;
 
Line 317 ⟶ 318:
 
// all character positions, grouped by character
int* ptr1 = cast(int*)alloca(len * int.sizeof)null;
if ((len * int.sizeof) < MAX_VLA_SIZE)
int[] ndx1 = ptr1 ? ptr1[0 .. len] : new int[len];
ptr1 = cast(int*)alloca(len * int.sizeof);
int[] ndx1 = (ptr1 ?== ptr1[0null) ..? new int[len] : new intptr1[0 .. len];
for (int ch = 0, i = 0; ch < NCHAR; ch++)
if (counts[ch])
Line 328 ⟶ 331:
 
// regroup them for cycles
int* ptr2 = cast(int*)alloca(len * int.sizeof)null;
if ((len * int.sizeof) < MAX_VLA_SIZE)
int[] ndx2 = ptr2 ? ptr2[0 .. len] : new int[len];
ptr2 = cast(int*)alloca(len * int.sizeof);
int[] ndx2 = (ptr2 ?== ptr2[0null) ..? new int[len] : new intptr2[0 .. len];
for (int i = 0, n = 0, m = 0; i < len; i++) {
ndx2[i] = ndx1[n];
Anonymous user