Alternate signs in a range
Stanislav Blinov
stanislav.blinov at gmail.com
Sun Jan 26 06:46:42 PST 2014
On Sunday, 26 January 2014 at 14:29:54 UTC, matovitch wrote:
>> s/immutable/enum/
>>
>> ?
>
> I am a *total* beginner so I am sure my code should look at
> least strange to experts. How should I write this ? Why ?
I am not sure exactly what are you trying to achieve. My comment
meant "ditch immutable, replace with enum" :) Also ditch array()
calls. This compiles:
import std.array;
import std.range;
import std.traits;
import std.algorithm;
template isBernstein(alias K) {
enum bool isBernstein = (K.empty ||
isNumeric!(typeof(K.front)));
}
struct Bernstein(alias K, int S) if (isBernstein!K)
{
enum kernel = K;
enum shift = S;
}
template reverse(alias B)
{
alias reverse = Bernstein!(retro(B.kernel), -(B.shift +
cast(int)B.kernel.length - 1));
}
template alternate(alias B)
{
alias alternate = Bernstein!(map!(a => a[0] *
a[1])(zip(B.kernel, cycle([-1, 1]))), B.shift);
}
void main() {
alias haar_scale = alternate!(Bernstein!([1.,1.], 0));
writeln(haar_scale.kernel);
writeln(haar_scale.shift);
}
I don't know if it works as intended though.
> ps : It seems the compiler lost the type information when
> unpacking the tuple ?
Which tuple?
> This code doesn't compile :
>
> template alternate(alias B)
> {
> alias alternate = Bernstein!(
> array(map!(a => a[0])(zip(B.kernel, cycle([-1, 1])))),
> B.shift);
> }
It does for me.
More information about the Digitalmars-d-learn
mailing list