Elimizin altında bulunsun, çok işe yarar...
import std.stdio, std.conv;
import std.range : take;
import std.random : uniform;
enum HEX {
O = '0', P, Q, R, S, T, U, V, W, X,
A = 'A', B, C, D, E, F
}
//import std.range : gen = generate;/*
template gen(alias fn) {
struct GenRes {
import std.traits : hasIndirections,
ReturnType, Unqual;
static if(!hasIndirections!(ReturnType!fn))
alias RetType = Unqual!(ReturnType!fn);
else
alias RetType = ReturnType!fn;
RetType func;
enum empty = false;
auto front() { return func; }
auto popFront() { func = fn(); }
}
GenRes gen() {
auto gen = GenRes();
gen.popFront();
return gen;
}
}//*/
void main() {
alias func = char delegate(); // function();
func range = () => uniform!"[]"(HEX.min, HEX.max);
auto rand1 = gen!range.take(15).to!(char[]);
auto rand2 = gen!(function char() =>
uniform!HEX).take(15);
// rand1 is an array!
typeof(rand1).stringof.writeln(" => ", rand1);
// rand2 is a range...
typeof(rand2).stringof.writeln(" => ", rand2);
/*
char[] => 1EEDA9ADAA7235E
Take!(GenRes) => FC4B4392DCF8A90
*/
enum len = 16;
alias T = HEX;
T[] enumArray;
assert(enumArray.length == 0);
enumArray.reserve = len;
assert(enumArray.capacity >= len);
assert(enumArray.length == 0);
import std.algorithm : each;
auto enumRange = gen!(function T() => uniform!T)
.take(len)
.each!(e => enumArray ~= e);
enumArray.writeln;
assert(enumArray.length == len);
//《[S, O, T, A, S, C, A, P, W, P, Q, D, E, A, C]
}
Dip Not: Kendi gen() şablonumu, kütüphanemdeki ilgili bug güncellenmediği için kullanıyorum ama yerine, ilgili satırın yorumunu açabilirsiniz de.
SDB@79