Merhaba,
Aşağıdaki çok çok temel bir konu. Aralıklar yoluyla bir yığından (Stack) ters/düz veri çekeceğiz. Aslında daha çok dinamik bir dizinin üzerinde gezineceğiz.
struct Stack
{
string s;
size_t index;
@system
{
string toString() { return s; }
bool empty() { return index >= s.length; }
void popFront() { index++; }
char front() { return s[index]; }
alias back = front;
void popBack() { index--; }
}
@property push(char c)
{
s ~= c;
}
@property pop()
{
//return s[index++];/*
scope(exit)
{
popFront();
}
return front();//*/
}
}
import std.stdio;
void main ()
{
auto deneme = Stack("deneme");
with(deneme)
{
foreach(n; 0..3) // soldan 3 karakter çek
{
pop.write;
}
push('1');
}
foreach_reverse(c; deneme) // kaldığı noktadan başa gez
{
c.write;
}
writeln; // denened
deneme.writeln; // deneme1
}
Aslında ForwardRange'de (popFront, front) bir sorun yok çünkü her şey istendiği gibi çalışıyor. Ancak işin içine BidirectionalRange'i de dahil edince tersten dizi üzerinde geziniyoruz. Tabi index'in türü size_t, yani işaretsiz. Bu durumda 0'dan sonra size_t.max'a çıkıyor ama Range violation hatası almıyoruz çünkü empty() akıllıca kurgulanmış.
Başarılar...