Merhaba,
Belki ismi EnumArray olmalıydı bilemiyorum! Az önce yazdığım kodu, eski bir arkadaşımın verdiği 4-5 satırlık ilham neticesinde paylaşmaya karar verdim. Çünkü bence çok mükemmel ve neredeyse en ufak bir hata yok? Belki %90 hatasızdır bilemiyorum çünkü unittest dışında çok test etmedim. Ama geliştirmeye açık olabilir.
Biz genelde enum'ları çok sık kullanırız ve dizi halinde pek az kullansak da hayatı kolaylaştıracak (özellikle indexOf ve başa ekleme özelliği kesinlikle başarılı. Çünkü veri dizge (string) olarak tutulmuyor ama isterseniz dizge veya sayı olarak da ekleyebilir ya da kişileştirmeye açık tür (E) ile de diziyi genişletebilirsiniz.
Bence kusursuz, sizce?
struct ConsArray(E)
{
E[] list;
size_t index;
void insertFront(T)(T value, int line = __LINE__) {
static if (is(T == string))
{
list = indexOf!E(value, line) ~ list;
}
else list = cast(E)value ~ list;
}
auto opIndex(size_t i) { return list[i]; }
auto length() { return list.length; }
bool empty() { return index == length; }
auto front() { return list[index]; }
void popFront() { ++index; }
void removeFront() { list = list[1..$]; }
void removeBack() { list = list[0..$ - 1]; }
void opOpAssign(string op : "~", T)(T value) {
this.list ~= cast(E)value;
}
auto indexOf(E)(string element, int line = __LINE__) {
import std.conv : to;
E count;
bool error = true;
while (count < count.max) {
if (count.to!string == element) {
error = false;
break;
}
++count;
}
if (error)
{
line.writefln!"Kod içinde (%s. satır) hata olabilir çünkü...";
throw new Exception("Geçersiz değer, lütfen geçerli bir değer girin.");
}
return count;
}
}
unittest
{
enum isim { Ali, Cengiz, Kaan, Mahmut, Salih }
ConsArray!isim isimler;
isimler ~= 0;
isimler ~= 1;
isimler ~= isim.Ali;
isimler ~= isimler[0];
isimler ~= isim.Salih;
isimler.removeFront();
isimler.insertFront(4);
isimler.insertFront("Kaan");
isimler.writeln; /* Çıktısı:
[Kaan, Salih, Cengiz, Ali, Ali, Salih]
*/
}
SDB@79