import std.stdio;
struct S(T)
{
T[] dinamikDizi;
alias dinamikDizi this;
/// Bunlar >>
alias potentialSize = limit;
size_t limit() { return dinamikDizi.capacity; }
alias dataSize = size;
size_t size() { return dinamikDizi.length; }
/// gereksiz ---^
ref T opIndex(size_t index)
{
if(index >= dinamikDizi.length)
{
dinamikDizi.length = index + 1;
}
return dinamikDizi[index];
}
}
/// **** 1. BÖLÜM ****
// Literal String(cümle)'den
// Static Array(verim)'e...
// verim'den dilim'e (10 karakterlik)
// dilüm'den ekrana ama sonraki bölüm fena :)
/// **** 2. BÖLÜM ****
// Stack Structure(stack) sayesinde
// Dynamic Array(dinamikDizi) ve doğrudan
// verim dizisi değiştirilerek eşit olmadığı
// kanıtı (assert(!))
/// **** 3. BÖLÜM ****
// Index Operator Overloading(opIndex) ile
// kapasitesi büyüyebilen(*) yapı dinamik dizi
// anlayışını bir üst seviyeye çıkarma
// alias dinamikDizi this; ile dilimleme ve
// birçok dizi olanağı aşırı yüklemesiz kullanabilme
// foreach() ve copy() ile aralık erişimi aynı şekilde
///
enum cümle = "C Language Foundation";
void main()
{
char[cümle.length] verim;
char[] dilim = verim[0..10];
foreach(i, chr; cümle) verim[i] = chr;
///
S!char stack;
foreach(i, chr; dilim)
{
stack[i] = chr;
chr.writeln(": ", stack.potentialSize);
}
verim[0] = 'D';
stack.writeln(": ", stack.length);
dilim.writeln(": ", dilim.length);
import std.algorithm : equal;
assert(!dilim.equal(stack));
///
const next = stack.length;
foreach(i, chr; cümle[next..$])
{
stack[i + next] = chr;
chr.writeln(": ", stack.potentialSize);
}
dilim = stack.dinamikDizi[0..10];
stack.writeln(": ", stack.length);
dilim.writeln(": ", dilim.length);
///
import std.algorithm.mutation : copy;
auto test = new char[cümle.length];
stack.copy(test);
test.length.writeln; // 21
test.capacity.writeln; // 31
test.writeln; // C Language Foundation
}
Merak eden olursa, ekstra açıklama sonra...