digitalmars.D - Is it possible to override and overload class Object?
- Salih Dincer (97/97) Sep 18 2023 Hi All,
- JG (3/10) Sep 18 2023 It is a bit unclear, what you want to achieve. Forgetting about
- Salih Dincer (30/32) Sep 19 2023 Actually, what I want to do is quite simple: The data kept as AA
- sighoya (4/6) Sep 19 2023 Adding a semicolon should [do
- sighoya (4/5) Sep 19 2023 Maybe your goal was to use the same operator and to switch by
- sighoya (20/20) Sep 19 2023 Hmm, is not updateing the url anymore, here is what I mean by
- Salih Dincer (17/19) Sep 19 2023 Your suggestion brought this solution to my mind. It looks
Hi All,
My problem is actually about the `new` operator. As far as I
know, we cannot overload it. Therefore, all the operators that I
use to create arrays with basic types work fine, but I need an
extra struct Array to use it in my own type (struct Payload in
the example).
Is there a simpler way to use the `+=` and `~=` operators on an
array of my own type?
```d
struct Array(T)
{
T* ptr;
size_t length;
ref auto opIndex(size_t i)
=> ptr[i];
ref auto opIndex()
=> this;
auto opSlice(size_t beg, size_t end)
=> Array(&ptr[beg], end - beg);
void opOpAssign(string op)(int rhs)
if(op == "+")
{
foreach(i; 0..length)
{
ptr[i] += rhs;
}
}
void opOpAssign(string op)(string rhs)
if(op == "~")
{
foreach(i; 0..length)
{
ptr[i] ~= rhs;
}
}
auto toString(ToSink sink) const
{
sink("[");
const limit = length - 1;
foreach(i; 0..limit)
{
sink.fmt("%s, ", ptr[i]);
}
sink.fmt("%s]", ptr[limit]);
}
}
struct Payload(T)
{
string id;
T value;
alias opCall this;
this(T x) { value = x; }
auto opCall(T x)
=> value = x;
auto opCall() inout
=> value;
auto opOpAssign(string op : "+")(T x)
=> value += x;
auto opOpAssign(string op : "~")(string x)
=> id ~= x;
auto toString(ToSink sink) const
=> sink.fmt("%s: %s", id, value);
}
alias ToSink = void delegate(const(char)[]);
import std.stdio, std.format: fmt = formattedWrite;
alias Type =
//Payload!
int;
enum len = 4;
void main()
{
auto arr = new Type[len];
arr[] += Type(1);
if(!is(Type == int))
arr[] += cast(Type)1;
arr.writeln;
auto payloads = Array!Type(arr.ptr, arr.length);
foreach(i; 0..len)
payloads[i] = i + 1;
payloads[] += 4;
payloads.writeln;
static if(!is(Type == int))
{
foreach(i, str; ["beş", "altı", "yedi", "sekiz"])
payloads[i].id = str;
payloads[] ~= " sayısı";
payloads.writeln;
}
}
```
**Playground:** https://run.dlang.io/is/qKKSok
Also please try and remove comment on line 74...
SDB 79
Sep 18 2023
On Monday, 18 September 2023 at 21:21:45 UTC, Salih Dincer wrote:Hi All, My problem is actually about the `new` operator. As far as I know, we cannot overload it. Therefore, all the operators that I use to create arrays with basic types work fine, but I need an extra struct Array to use it in my own type (struct Payload in the example). [...]It is a bit unclear, what you want to achieve. Forgetting about the implementation what would you like to write but can't?
Sep 18 2023
On Tuesday, 19 September 2023 at 06:28:07 UTC, JG wrote:It is a bit unclear, what you want to achieve. Forgetting about the implementation what would you like to write but can't?Actually, what I want to do is quite simple: The data kept as AA will be stored in a payload array and according to its value. But it's not enough! Because whenever I want, I have to add string to key(id) or change the value mathematically. I managed to do this, but it was a very winding road :( For example: ```d string[size_t] data; void main() { data = [0: "zero", 1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six"]; auto len = data.length; auto arr = new Type[len]; foreach(i, ref e; arr) { e = Type(data[i], cast(int)i); } auto pay = Array!Type(arr.ptr, len); pay[] ~= " quantity"; pay[] += 10; pay.writeln; /* Prints: [zero quantity: 10, one quantity: 11, two quantity: 12, three quantity: 13, four quantity: 14, five quantity: 15, six quantity: 16] //*/ } ``` SDB 79
Sep 19 2023
On Monday, 18 September 2023 at 21:21:45 UTC, Salih Dincer wrote:Also please try and remove comment on line 74... SDB 79Adding a semicolon should [do it](https://run.dlang.io/?compiler=dmd&source=struct%20Array(T)%0A%7B%0A%20%20T*%20ptr;%0A%20%C2%A0size_t%20length;%0A%20%C2%A0%0A%20%C2%A0ref%20auto%20opIndex(size_t%20i)%0A%20%20%20%20%3D%3E%20ptr%5Bi%5D;%0A%20%20%0A%20%C2%A0ref%20auto%20opIndex()%0A%20%20%20%20%3D%3E%20this;%0A%20%C2%A0%0A%20%20auto%20opSlice(size_t%20beg,%20size_t%20end)%0A%20%C2%A0%20%C2%A0%3D%3E%20Array(%26ptr%5Bbeg%5D,%20end%20-%20beg);%0A%0A%20%C2%A0void%20opOpAssign(string%20op)(int%20rhs)%20%0A%20%C2%A0if(op%20%3D%3D%20%22%2B%22)%0A%20%20%7B%0A%20%20%20%20foreach(i;%200..length)%0A%20%20%20%20%7B%0A%20%C2%A0%20%C2%A0%20%C2%A0ptr%5Bi%5D%20%2B%3D%20rhs;%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%20%20%0A%20%C2%A0void%20opOpAssign(string%20op)(string%20rhs)%20%0A%20%C2%A0if(op%20%3D%3D%20%22~%22)%0A%20%20%7B%0A%20%20%20%20foreach(i;%200..length)%0A%20%20%20%20%7B%0A%20%C2%A0%20%C2%A0%20%C2%A0ptr%5Bi%5D%20~%3D%20rhs;%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%0A%20%C2%A0auto%20toString(ToSink%20sink)%20const%0A%20%20%7B%0A%20%20%20%20sink(%22%5B%22);%0A%20%20%20%20const%20limit%20%3D%20length%20-%201;%0A%20%20%20%20foreach(i;%200..limit)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20sink.fmt(%22%25s,%20%22,%20ptr%5Bi%5D);%0A%20%20%20%20%7D%0A%20%20%20%20sink.fmt(%22%25s%5D%22,%20ptr%5Blimit%5D);%0A%20%20%7D%0A%7D%0A%0Astruct%20Payload(T)%0A%7B%0A%20%20string%20id;%0A%20%C2%A0T%20value;%0A%20%20%20%20%0A%20%20alias%20opCall%20this;%0A%20%0A%20%C2%A0this(T%20x)%20%7B%20value%20%3D%20x;%20%7D%0A%20%20%0A%20%C2%A0auto%20opCall(T%20x)%0A%20%20%20%20%3D%3E%20value%20%3D%20x;%0A%20%20%0A%20%C2%A0auto%20opCall()%20inout%0A%20%20%20%20%3D%3E%20value;%0A%20%20%0A%20%C2%A0auto%20opOpAssign(string%20op%20:%20%22%2B%22)(T%20x)%0A%20%C2%A0%20%C2%A0%3D%3E%20value%20%2B%3D%20x;%0A%20%20%0A%20%C2%A0auto%20opOpAssign(string%20op%20:%20%22~%22)(string%20x)%0A%20%C2%A0%20%C2%A0%3D%3E%20id%20~%3D%20x;%0A%20%C2%A0%0A%20%20auto%20toString(ToSink%20sink)%20const%0A%20%C2%A0%20%C2%A0%3D%3E%20sink.fmt(%22%25s:%20%25s%22,%20id,%20value);%0A%7D%0A%0Aalias%20ToSink%20%3D%20void%20delegate(const(char)%5B%5D);%0A%0Aimport%20std.stdio,%20std.format:%20fmt%20%3D%20formattedWrite;%0Aalias%20Type%20%3D%0A%20%C2%A0%20%C2%A0%2F%2FPayload!%0A%20%C2%A0%20%C2%A0int;%0Aenum%20len%20%3D%204;%0A%0Avoid%20main()%20%0A%7B%0A%20%C2%A0auto%20arr%20%3D%20new%20Type%5Blen%5D;%0A%20%C2%A0arr%5B%5D%20%2B%3D%20Type(1);%0A%20%20%0A%20%C2%A0if(!is(Type%20%3D%3D%20int))%0A%20%C2%A0%20%C2%A0arr%5B%5D%20%2B%3D%20cast(Type)1;%0A%20%C2%A0arr.writeln;%0A%20%20%20%20%0A%20%C2%A0auto%20payloads%20%3D%20Array!Type(arr.ptr,%20arr.length);%0A%20%20%0A%20%C2%A0foreach(i;%200..len)%0A%20%C2%A0%20%C2%A0payloads%5Bi%5D%20%3D%20i%20%2B%201;%0A%20%0A%20%C2%A0payloads%5B%5D%20%2B%3D%204;%0A%20%20payloads.writeln;%0A%20%C2%A0%0A%20%C2%A0static%20if(!is(Type%20%3D%3D%20int))%0A%20%20%7B%0A%20%20%20%C2%A0foreach(i,%20str;%20%5B%22be%C5%9F%22,%20%22alt%C4%B1%22,%20%22yedi%22,%20%22sekiz%22%5D)%0A%20%C2%A0%20%20%C2%A0%20payloads%5Bi%5D.id%20%3D%20str;%0A%20%C2%A0%20%20payloads%5B%5D%20~%3D%20%22%20say%C4%B1s%C4%B1%22;%0A%20%20%20%C2%A0payloads.writeln;%0A%20%C2%A0%7D%0A%7D). Was that your problem to be solved?
Sep 19 2023
On Monday, 18 September 2023 at 21:21:45 UTC, Salih Dincer wrote:[...]Maybe your goal was to use the same operator and to switch by type, should be possible, [see here](https://run.dlang.io/?compiler=dmd&source=struct%20Array(T)%0A%7B%0A%20%20T*%20ptr;%0A%20%C2%A0size_t%20length;%0A%20%C2%A0%0A%20%C2%A0ref%20auto%20opIndex(size_t%20i)%0A%20%20%20%20%3D%3E%20ptr%5Bi%5D;%0A%20%20%0A%20%C2%A0ref%20auto%20opIndex()%0A%20%20%20%20%3D%3E%20this;%0A%20%C2%A0%0A%20%20auto%20opSlice(size_t%20beg,%20size_t%20end)%0A%20%C2%A0%20%C2%A0%3D%3E%20Array(%26ptr%5Bbeg%5D,%20end%20-%20beg);%0A%0A%20%C2%A0void%20opOpAssign(string%20op)(int%20rhs)%20%0A%20%C2%A0if(op%20%3D%3D%20%22%2B%22)%0A%20%20%7B%0A%20%20%20%20foreach(i;%200..length)%0A%20%20%20%20%7B%0A%20%C2%A0%20%C2%A0%20%C2%A0ptr%5Bi%5D%20%2B%3D%20rhs;%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%20%20%0A%20%C2%A0void%20opOpAssign(string%20op)(string%20rhs)%20%0A%20%C2%A0if(op%20%3D%3D%20%22~%22)%0A%20%20%7B%0A%20%20%20%20foreach(i;%200..length)%0A%20%20%20%20%7B%0A%20%C2%A0%20%C2%A0%20%C2%A0ptr%5Bi%5D%20~%3D%20rhs;%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20%0A%20%C2%A0auto%20toString(ToSink%20sink)%20const%0A%20%20%7B%0A%20%20%20%20sink(%22%5B%22);%0A%20%20%20%20const%20limit%20%3D%20length%20-%201;%0A%20%20%20%20foreach(i;%200..limit)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20sink.fmt(%22%25s,%20%22,%20ptr%5Bi%5D);%0A%20%20%20%20%7D%0A%20%20%20%20sink.fmt(%22%25s%5D%22,%20ptr%5Blimit%5D);%0A%20%20%7D%0A%7D%0A%0Astruct%20Payload(T)%0A%7B%0A%20%20string%20id;%0A%20%C2%A0T%20value;%0A%20%20%20%20%0A%20%20alias%20opCall%20this;%0A%20%0A%20%C2%A0this(T%20x)%20%7B%20value%20%3D%20x;%20%7D%0A%20%20%0A%20%C2%A0auto%20opCall(T%20x)%0A%20%20%20%20%3D%3E%20value%20%3D%20x;%0A%20%20%0A%20%C2%A0auto%20opCall()%20inout%0A%20%20%20%20%3D%3E%20value;%0A%20%20%0A%20%C2%A0auto%20opOpAssign(string%20op%20:%20%22%2B%22)(T%20x)%0A%20%C2%A0%20%C2%A0%3D%3E%20value%20%2B%3D%20x;%0A%20%20%0A%20%C2%A0auto%20opOpAssign(string%20op%20:%20%22~%22)(string%20x)%0A%20%C2%A0%20%C2%A0%3D%3E%20id%20~%3D%20x;%0A%20%C2%A0%0A%20%20auto%20toString(ToSink%20sink)%20const%0A%20%C2%A0%20%C2%A0%3D%3E%20sink.fmt(%22%25s:%20%25s%22,%20id,%20value);%0A%7D%0A%0Aalias%20ToSink%20%3D%20void%20delegate(const(char)%5B%5D);%0A%0Aimport%20std.stdio,%20std.format:%20fmt%20%3D%20formattedWrite;%0Aalias%20Type%20%3D%0A%20%C2%A0%20%C2%A0%2F%2FPayload!%0A%20%C2%A0%20%C2%A0int;%0Aenum%20len%20%3D%204;%0A%0Avoid%20main()%20%0A%7B%0A%20%C2%A0auto%20arr%20%3D%20new%20Type%5Blen%5D;%0A%20%C2%A0arr%5B%5D%20%2B%3D%20Type(1);%0A%20%20%0A%20%C2%A0if(!is(Type%20%3D%3D%20int))%0A%20%C2%A0%20%C2%A0arr%5B%5D%20%2B%3D%20cast(Type)1;%0A%20%C2%A0arr.writeln;%0A%20%20%20%20%0A%20%C2%A0auto%20payloads%20%3D%20Array!Type(arr.ptr,%20arr.length);%0A%20%20%0A%20%C2%A0foreach(i;%200..len)%0A%20%C2%A0%20%C2%A0payloads%5Bi%5D%20%3D%20i%20%2B%201;%0A%20%0A%20%C2%A0payloads%5B%5D%20%2B%3D%204;%0A%20%20payloads.writeln;%0A%20%C2%A0%0A%20%C2%A0static%20if(!is(Type%20%3D%3D%20int))%0A%20%20%7B%0A%20%20%20%C2%A0foreach(i,%20str;%20%5B%22be%C5%9F%22,%20%22alt%C4%B1%22,%20%22yedi%22,%20%22sekiz%22%5D)%0A%20%C2%A0%20%20%C2%A0%20payloads%5Bi%5D.id%20%3D%20str;%0A%20%C2%A0%20%20payloads%5B%5D%20~%3D%20%22%20say%C4%B1s%C4%B1%22;%0A%20%20%20%C2%A0payloads.writeln;%0A%20%C2%A0%7D%0A%7D)
Sep 19 2023
Hmm, is not updateing the url anymore, here is what I mean by
code:
```d
void opOpAssign(string op,T:int)(T rhs)
if(op == "+")
{
foreach(i; 0..length)
{
ptr[i] += rhs;
}
}
void opOpAssign(string op,T:string)(T rhs)
if(op == "+")
{
foreach(i; 0..length)
{
ptr[i] ~= rhs;
}
}
```
Sep 19 2023
On Tuesday, 19 September 2023 at 16:47:14 UTC, sighoya wrote:Hmm, is not updateing the url anymore, here is what I mean by codeYour suggestion brought this solution to my mind. It looks really delicious, thank you: ```d void opOpAssign(string op: "+", R)(R rhs) { import std.traits; static if(isNumeric!R) foreach(i; 0..length) ptr[i] += rhs; else foreach(i; 0..length) ptr[i] ~= rhs; } ``` Both structures are not even 60 lines total. I like this last edit: https://run.dlang.io/is/Ciusqs SDB 79
Sep 19 2023









Salih Dincer <salihdb hotmail.com> 