Merging one Array with Another
Ali Çehreli via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri May 1 21:08:02 PDT 2015
On 05/01/2015 06:39 PM, "Per =?UTF-8?B?Tm9yZGzDtnci?=
<per.nordlow at gmail.com>" wrote:> On Friday, 1 May 2015 at 22:47:17 UTC,
Ali Çehreli wrote:
>> It is about the uniqueness of consecutive elements. It says "unique
>> consecutive elements".
>>
>> Ali
>
> Ah.
>
> Then I guess that if input is SortedRange then SortedRange should be
> returned.
Interesting idea. I have defined a simple algorithm below to see how it
could work (my skipped() function instead of uniq()).
import std.stdio;
import std.range;
import std.algorithm;
import std.exception;
struct Skipper(R)
{
R range;
this(R range)
{
enforce(range.length % 2 == 0,
"This example requires even number of elements");
this.range = range;
}
@property bool empty() { return range.empty; }
@property auto front() { return range.front; }
void popFront()
{
range.popFront();
range.popFront();
}
}
auto skipped(R)(R range)
{
import std.traits;
static if (isInstanceOf!(SortedRange, R)) {
// Nice! Let's add an .assumeSorted at the end
return Skipper!R(range).assumeSorted;
} else {
return Skipper!R(range);
}
}
void use(R)(R range)
{
pragma(msg, R);
writeln(range);
writeln();
}
void main()
{
auto a = [ 1, 2, 3, 4, 5, 6 ];
use(a.skipped);
use(a.assumeSorted.skipped);
}
Prints at compile time:
Skipper!(int[])
SortedRange!(Skipper!(SortedRange!(int[], "a < b")), "a < b")
Prints at run time:
[1, 3, 5]
[1, 3, 5]
One issue is that many standard algorithms could benefit from this as
well. Should it be only for SortedRange? What about user defined
types... What if I wanted MyCoolRange to be appended automatically as
.myCoolRange. Could there we standard mechanism to support any range type?
Maybe the answer is a helper mixin that defines a template
specialization for SortedRange!(R2, Func) instead of my 'static if'
solution. (I was too impatient to get that syntax right. :) )
Ali
More information about the Digitalmars-d-learn
mailing list