Event struct via registers

Vitaliy Fadeev vital.fadeev at gmail.com
Sat Aug 10 07:46:46 UTC 2024


## Trouble 1

Pass the structure through registers ?

## Trouble 2

Wrap the registries in a structure ?

## Use case

I need to pass different events: `Draw_Event`, 
`Mouse_Move_Event`, `...`
I need to pass an event to many objects: `foreach (o; world) 
o.event (e);`
I need speed.
I want to pass the structure in registers: (like __fastcall 
callin convention): `void _event (REG r1, REG r2, REG r3, REG 
r4);`. But it's hard to read.
I want comfortable use: (like a wrap registers in struct):
```
void
event (Event e) {
     writeln (e.type);
     writeln (e.code);
     writeln (e.value);
     switch (e.type) {
       case Type.REL: _rel_event (e); break;
       case Type.GUI: _gui_event (e); break;
       case Type.APP: _app_event (e); break;
       default:
     }
}
```

The problem is that the size of the structure is larger than the 
size of the register.

```
struct
Event {          //  64 bit
   ushort type;   //  16 bit
   ushort code;   //  16 bit
   uint   value;  //  32 bit
}
```

But the event size can be > 64 bit. More than register size.

```
struct
Mouse_Event {    // 128 bit
   ushort type;   //  16 bit
   ushort code;   //  16 bit
   uint   value;  //  32 bit
   float  x;      //  32 bit
   float  y;      //  32 bit
}

struct
Draw_Event {     // 192 bit
   ushort type;   //  16 bit
   ushort code;   //  16 bit
   uint   value;  //  32 bit
   float  x;      //  32 bit
   float  y;      //  32 bit
   float  w;      //  32 bit
   float  h;      //  32 bit
}
```

How to implement on D?



More information about the Digitalmars-d-learn mailing list