Event struct via registers
Vitaliy Fadeev
vital.fadeev at gmail.com
Sat Aug 10 08:04:10 UTC 2024
On Saturday, 10 August 2024 at 07:46:46 UTC, Vitaliy Fadeev wrote:
> ## Trouble 1
>
> Pass the structure through registers ?
>
> ## Trouble 2
>
> Wrap the registries in a structure ?
> How to implement on D?
I try:
```
import std.stdio;
void
main() {
Event_1 event_1;
event (event_1);
Event_2 event_2;
event (event_2);
}
struct
Event_1 {
ushort type = 1;
ushort code = 2;
uint value = 3;
}
struct
Event_2 {
ushort type = 1;
ushort code = 2;
uint value = 3;
float x = 4.0;
float y = 5.0;
}
void
event (EVENT) (/* R this, */ EVENT e) {
enum REG_SIZE = (void*).sizeof; // Bytes
pragma (msg, EVENT, " : ", EVENT.sizeof);
pragma (msg, "REG_SIZE: ", REG_SIZE);
static if (EVENT.sizeof == 0) {
//
}
else
static if (EVENT.sizeof <= REG_SIZE) { // 64 bit
_event (/* this, */
* cast (REG*) &e,
//* cast (REG*) cast (ubyte*) &e,
//cast (REG) *(
// (cast (ubyte*) &e)[0..EVENT.sizeof].ptr
//),
0,
0);
}
else
static if (EVENT.sizeof <= 2*REG_SIZE) { // 128 bit
_event (/* this, */
cast (REG) *(
(cast (ubyte*) &e)[0..REG_SIZE].ptr
),
cast (REG) *(
(cast (ubyte*) &e)[REG_SIZE..EVENT.sizeof].ptr
),
0);
}
else
static assert (0, "Event sizeof too much");
}
alias REG = ulong;
void
_event (/* REG this, */ REG type_code_value, REG r3, REG r4) {
//switch (type_code_value.type) {
// case Event.Type.GUI: gui.event (type_code_value, r3,
r4); break;
// default:
//}
writeln ("type_code_value: ", type_code_value);
writeln ("r3: ", r3);
writeln ("r4: ", r4);
Event_1 event_1;
event_1 = * cast (Event_1*) &type_code_value;
writeln (" event_1 :", event_1);
if (r3 != 0) {
writeln (" event_2 :", r3);
}
}
```
But i have 0 in r3.
I need help converting the structure `Event_2` into 2 `ulong`
parameters `type_code_value`, `r3`.
More information about the Digitalmars-d-learn
mailing list