opIndexUnary post in-/decrement how to ?
vit
vit at vit.vit
Wed Jul 14 15:19:03 UTC 2021
On Wednesday, 14 July 2021 at 15:01:45 UTC, wjoe wrote:
> On Wednesday, 14 July 2021 at 14:39:03 UTC, vit wrote:
>> On Wednesday, 14 July 2021 at 13:16:49 UTC, Tejas wrote:
>>> [...]
>>
>>
>> This work:
>>
>> ```d
>> import std.stdio;
>>
>> struct abc{
>> int[100] a;
>>
>> ref int opIndex(int index)return{
>> return a[index];
>> }
>> }
>>
>> void main (){
>> abc s;
>> s[0]++;
>> ++s[0];
>> }
>>
>> ```
>
> This does work for that example but I can't return by reference
> because what I'm operating on is a part of an int.
> Some context:
> ```D
> struct part_int_t(ARGS...)
> {
> int _int;
> mixin(generate_parts!ARGS);
> }
>
> alias handle_t = part_int_t!("isAllocated", 1, "gen", 8,
> "index", 23);
>
> handle_t handle;
>
> static assert (is(handle.typeof_isAllocated): bool));
> static assert (is(handle.typeof_gen): ubyte));
> static assert (is(handle.typeof_index): uint));
>
> handle[2] = true;
> handle.gen = 1;
> handle.index = 1234;
>
> assert (handle.isAllocated);
> assert (handle.gen = 1);
> assert (handle[0] = 1234);
>
> handle++;
> assert (handle.index == 1235);
>
> handle.gen++;
> assert (handle.gen == 2);
>
> handle.reset();
> assert (!handle.isAllocated);
> assert (handle.gen = 3);
> assert (handle.index = 0);
>
> ```
>
> generate_parts!ARGS produces bit masks, getters, setters,
> opIndex/OpAssign/Unary, etc. and it's impossible to return bits
> 0-26 of _int by ref.
Try something like this:
```d
import std.stdio;
struct abc{
int[100] a;
struct Proxy{
abc* ptr;
const int index;
int opUnary(string op : "++")(){
return ptr.a[index];
}
}
Proxy opIndex(int index)return{
return Proxy(&this, index);
}
}
void main (){
abc s;
s[0]++;
++s[0];
}
```
More information about the Digitalmars-d-learn
mailing list