November 05

İyi pazarlar herkese,

Şahsen sabahın bereketi mi desem (ve maşaallah) ne desem; benim için çok iyi 1-2 saat geçti!

Hemen aşağıya test sonucunu, kodun bir kısmıyla beraber paylaşmak istiyorum çünkü böyle bir verimi (elbette hızlı değil çünkü find() yöntemi O(N), maalesef!) ilk defa yaşadım. Yani kodlar beynimden şakır şakır aktı, heyacanımı mazur görün n'olur :)

auto CharBuffer(return ref char[] arr)
{
  return new ArrayBuffer!char(&arr);
}

void main()
{
  int[] arr = [ 1, 0, 0, 1, 1, 0, 1 ];
  auto dizi = new ArrayBuffer!int(&arr);

  dizi.put(1);
  dizi.writeln("\n");

  size_t sıfırlarınAdeti, sonKonum;
  while(dizi.find(0, sonKonum))
  {
    sonKonum.writeln(": ", ++sıfırlarınAdeti);
  }
  sıfırlarınAdeti.writeln(" adet bulundu!");
  dizi.length.writefln!"Dizi uzunluğu hala %s";
  writeln("yani arama yaparken, dizi/aralık");
  "tükenmiyor->".writeln; assert(!dizi.empty);

  "Bir başka kanıt: ".writeln(dizi);
  foreach(d; dizi) d.write(" ");
  "Eyvah şimdi boş: ".writeln(dizi);

  assert(arr.length == dizi.length);
  writeln; // işte çalışma zamanı kanıtı:
  assert(dizi.empty);
}
/*
IntBuffer("[1, 0, 0, 1, 1, 0, 1, 1]")

1
1: 1
2
2: 2
5
5: 3
3 adet bulundu!
Dizi uzunluğu hala 8
yani arama yaparken, dizi/aralık
tükenmiyor->
Bir başka kanıt: IntBuffer("[1, 0, 0, 1, 1, 0, 1, 1]")
1 0 0 1 1 0 1 1 Eyvah şimdi boş: IntBuffer("[]")
*/

Sınıf henüz beta olduğu için paylaşamıyorum. N'olur bu konuda da beni mazur görün ama herkesin işine yarayabilecek bir override toString katması (mixin) aklıma öylesine geli verdi. Mutlaka sınıflarla çalışırken herkesin işine yarayacaktır. İşte türe göre ismi/kimliği değişen toString(), sınıfın başı:

class ArrayBuffer(A)
{
  private
  {
    import std.ascii : toUpper;
    enum TS = A.stringof;
    enum TN = TS[0].toUpper ~ TS[1..$];
    enum ID = `enum ObjectID = "` ~ TN;

    import std.traits : isNumeric;
    static if(!isNumeric!A)
    {
      mixin(ID ~ `Buffer(\"%s\")";`);
    } else mixin(ID ~`Buffer(%s)";`);

    A[] *buffer;
    ref arr() { return *buffer; }
  }

  this(return A[]* arr) { buffer = arr; }

  override string toString()
  {
    import std.string : format;
    return arr.format!ObjectID;
  }
 //...
}

Bu İliştirici'nin yeni sürümü ve eskisi, put() dışında pek özelliğe sahip değildi. Şahsen böyle basit şeyleri Appender'a tercih ediyorum. Siz de severseniz geçmiş konunun alevlendiği noktalar da referans veren başlıkla devam edebilirsiniz. Dile kolay koca bir sene geçmiş :)

https://forum.dlang.org/post/wnljzpimxrmxuaxcswel@forum.dlang.org

SDB@79