How to best translate this C++ algorithm into D? - refill with range

Nick Treleaven via Digitalmars-d digitalmars-d at puremagic.com
Wed Jun 11 06:45:58 PDT 2014


On 07/06/2014 16:39, monarch_dodra wrote:
> Then, you are using the code:
> .partition!(forest_invalid).sort.uniq.array;
>
> The "advantage" of "partition" over "filter" is that "partition" is a
> greedy inplace algorithm. But then, you go on to use "uniq", which is
> lazy, and requires "array". I implemented a (very) simplistic in-place
> "removeDuplicates":

More generally, perhaps we could have a function to apply a lazy range 
to an existing random-access range:

import std.range;

/** Copy up to r.length elements of src to r. */
auto refill(R, Input)(ref R r, Input src)
if (isRandomAccessRange!R && isInputRange!Input)
{
     foreach (i, ref e; r)
     {
         if (src.empty)
         {
             r.length = i;
             return r;
         }
         e = src.front;
         src.popFront;
     }
     // ignore leftover elements in src
     return r;
}

import std.algorithm : uniq;

/// eager wrapper for uniq
auto dedup(T)(ref T v){return v.refill(v.uniq);}
//alias dedup = (ref v) => v.refill(v.uniq);

void main()
{
     auto a = [5,5,5,5,4,3,3,3,1];
     a.dedup;
     assert(a == [5, 4, 3, 1]);
}



More information about the Digitalmars-d mailing list