October 24

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