use static if for better readybility
This commit is contained in:
parent
f865e49519
commit
7e3f2cc611
2 changed files with 20 additions and 24 deletions
|
@ -14,8 +14,25 @@ enum Cipher
|
||||||
chacha20
|
chacha20
|
||||||
}
|
}
|
||||||
|
|
||||||
mixin(cipherFunctionString!(InputRange, isOnlyInputRange));
|
template cipherFunction(R)
|
||||||
mixin(cipherFunctionString!(ForwardRange, isForwardRange));
|
if(isInputRange!R && is(ElementType!R : ubyte))
|
||||||
|
{
|
||||||
|
static if(isForwardRange!R)
|
||||||
|
alias ReturnType = ForwardRange;
|
||||||
|
else
|
||||||
|
alias ReturnType = InputRange;
|
||||||
|
|
||||||
|
ReturnType!(ElementType!R) cipherFunction(R range, ubyte[32] key, ubyte[8] nonce, Cipher cipher)
|
||||||
|
{
|
||||||
|
final switch (cipher)
|
||||||
|
{
|
||||||
|
case Cipher.salsa20:
|
||||||
|
return range.salsa20Cipher(key, nonce).inputRangeObject;
|
||||||
|
case Cipher.chacha20:
|
||||||
|
return range.chacha20Cipher(key, nonce).inputRangeObject;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
unittest
|
unittest
|
||||||
{
|
{
|
||||||
|
@ -31,24 +48,3 @@ unittest
|
||||||
static assert(isForwardRange!(typeof(b)));
|
static assert(isForwardRange!(typeof(b)));
|
||||||
static assert(isInputRange!(typeof(d)) && !(isForwardRange!(typeof(d))));
|
static assert(isInputRange!(typeof(d)) && !(isForwardRange!(typeof(d))));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
template isOnlyInputRange(R)
|
|
||||||
{
|
|
||||||
enum isOnlyInputRange = isInputRange!R && !(isForwardRange!R);
|
|
||||||
}
|
|
||||||
|
|
||||||
enum cipherFunctionString(alias ReturnType, alias Constraint) = q{
|
|
||||||
%s!(ElementType!R) cipherFunction(R)(R range, ubyte[32] key, ubyte[8] nonce, Cipher cipher)
|
|
||||||
if (is(ElementType!R : ubyte) && %s!R)
|
|
||||||
{
|
|
||||||
final switch (cipher)
|
|
||||||
{
|
|
||||||
case Cipher.salsa20:
|
|
||||||
return range.salsa20Cipher(key, nonce).inputRangeObject;
|
|
||||||
case Cipher.chacha20:
|
|
||||||
return range.chacha20Cipher(key, nonce).inputRangeObject;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.format(__traits(identifier, ReturnType), __traits(identifier, Constraint));
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ unittest
|
||||||
enum string rowRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
enum string rowRound(alias _x00, alias _x01, alias _x02, alias _x03,
|
||||||
alias _x04, alias _x05, alias _x06, alias _x07,
|
alias _x04, alias _x05, alias _x06, alias _x07,
|
||||||
alias _x08, alias _x09, alias _x10, alias _x11,
|
alias _x08, alias _x09, alias _x10, alias _x11,
|
||||||
alias _x12, alias _x13, alias _x14, alias _x15,) = q{
|
alias _x12, alias _x13, alias _x14, alias _x15) = q{
|
||||||
mixin(quarterRound!(%1$s, %2$s, %3$s, %4$s));
|
mixin(quarterRound!(%1$s, %2$s, %3$s, %4$s));
|
||||||
mixin(quarterRound!(%6$s, %7$s, %8$s, %5$s));
|
mixin(quarterRound!(%6$s, %7$s, %8$s, %5$s));
|
||||||
mixin(quarterRound!(%11$s, %12$s, %9$s, %10$s));
|
mixin(quarterRound!(%11$s, %12$s, %9$s, %10$s));
|
||||||
|
|
Loading…
Reference in a new issue