xxxxxxxxxx
struct Array(T)
{
T* ptr;
auto opIndex() => this;
size_t length;
auto opDollar() => length;
this(size_t length)
{
this.ptr = new T[length].ptr;
this.length = length;
}
this(T* ptr, size_t length)
{
this.ptr = ptr;
this.length = length;
}
ref T opIndex(size_t i) => ptr[i];
auto opSlice(size_t beg, size_t end)
=> Array(&ptr[beg], end - beg);
void opOpAssign(string op)(T rhs)
if((op == "+") || (op == "*"))
{
foreach(i; 0..length)
{
mixin("ptr[i] " ~ op ~ "= rhs;");
}
}
alias ToSink = void delegate(const(char)[]);
void toString(ToSink sink) const
{
import std.format: fmt = formattedWrite;
sink("[");
const limit = length - 1;
foreach(i; 0..limit)
{
sink.fmt("%s, ", ptr[i]);
}
sink.fmt("%s]", ptr[limit]);
}
}
enum test = 10;
import std.stdio;
void main()
{
// EN KISA KURULUM:
auto arr = Array!int(test);
foreach(i; 0..test) arr[i] = i + 1;
arr.writeln; // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr[] += 1; // tüm üyelere birer ekle
arr.writeln; // [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
arr[] *= 2; // tüm üyeleri ikiye katla
arr.writeln; // [4, 6, 8, 10, 12, 14, 16, 18, 20, 22]
// PARALEL KURULUM (paylaşımlı):
auto n = new int[test];
auto p = Array!int(n.ptr, test);
foreach(num, ref e; n)
{
e = cast(int)num + 1;
}
p.writeln; // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n[] *= 2;
n.writeln; // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
p[] *= 2;
n.writeln; // [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
n[4..$].writeln; // [20, 24, 28, 32, 36, 40]
p[4..$].writeln; // [20, 24, 28, 32, 36, 40]
}