#include <inttypes.h>
#include <stdio.h>
#define update_last(n, X, p) \
_Generic((X), \
float *: updatef, \
default: updatei16, \
uint16_t *: updateu16 \
)(n, X, p)
// src must have type (int16_t *)
void updatei16(size_t n, int16_t a[static n], void *src) {
a[n-1] = *(int16_t *)src;
}
// src must have type (uint16_t *)
void updateu16(size_t n, uint16_t a[static n], void *src) {
a[n-1] = *(uint16_t *)src;
}
// src must have type (float *)
void updatef(size_t n, float a[static n], void *src) {
a[n-1] = *(float *)src;
}
int main(void) {
float ff[1] = { 2023 }, fff = 3.1416F;
uint16_t uu[1] = { 2023 }, uuu = 42;
int16_t ii[1] = { 2023 }, iii = -1;
printf("%f, %"PRIu16
", %"PRId16
"\n", ff
[0], uu
[0], ii
[0]);
update_last(1, ff, &fff);
update_last(1, uu, &uuu);
update_last(1, ii, &iii);
printf("%f, %"PRIu16
", %"PRId16
"\n", ff
[0], uu
[0], ii
[0]);
return 0;
}
I2luY2x1ZGUgPGludHR5cGVzLmg+CiNpbmNsdWRlIDxzdGRpby5oPgoKI2RlZmluZSB1cGRhdGVfbGFzdChuLCBYLCBwKSBcCiAgICAgICAgX0dlbmVyaWMoKFgpLCBcCiAgICAgICAgICAgIGZsb2F0ICo6IHVwZGF0ZWYsIFwKICAgICAgICAgICAgZGVmYXVsdDogdXBkYXRlaTE2LCBcCiAgICAgICAgICAgIHVpbnQxNl90ICo6IHVwZGF0ZXUxNiBcCiAgICAgICAgKShuLCBYLCBwKQoKLy8gc3JjIG11c3QgaGF2ZSB0eXBlIChpbnQxNl90ICopCnZvaWQgdXBkYXRlaTE2KHNpemVfdCBuLCBpbnQxNl90IGFbc3RhdGljIG5dLCB2b2lkICpzcmMpIHsKICAgIGFbbi0xXSA9ICooaW50MTZfdCAqKXNyYzsKfQoKLy8gc3JjIG11c3QgaGF2ZSB0eXBlICh1aW50MTZfdCAqKQp2b2lkIHVwZGF0ZXUxNihzaXplX3QgbiwgdWludDE2X3QgYVtzdGF0aWMgbl0sIHZvaWQgKnNyYykgewogICAgYVtuLTFdID0gKih1aW50MTZfdCAqKXNyYzsKfQoKLy8gc3JjIG11c3QgaGF2ZSB0eXBlIChmbG9hdCAqKQp2b2lkIHVwZGF0ZWYoc2l6ZV90IG4sIGZsb2F0IGFbc3RhdGljIG5dLCB2b2lkICpzcmMpIHsKICAgIGFbbi0xXSA9ICooZmxvYXQgKilzcmM7Cn0KCmludCBtYWluKHZvaWQpIHsKICAgIGZsb2F0IGZmWzFdID0geyAyMDIzIH0sIGZmZiA9IDMuMTQxNkY7CiAgICB1aW50MTZfdCB1dVsxXSA9IHsgMjAyMyB9LCB1dXUgPSA0MjsKICAgIGludDE2X3QgaWlbMV0gPSB7IDIwMjMgfSwgaWlpID0gLTE7CgogICAgcHJpbnRmKCIlZiwgJSJQUkl1MTYiLCAlIlBSSWQxNiJcbiIsIGZmWzBdLCB1dVswXSwgaWlbMF0pOwoKICAgIHVwZGF0ZV9sYXN0KDEsIGZmLCAmZmZmKTsKICAgIHVwZGF0ZV9sYXN0KDEsIHV1LCAmdXV1KTsKICAgIHVwZGF0ZV9sYXN0KDEsIGlpLCAmaWlpKTsKCiAgICBwcmludGYoIiVmLCAlIlBSSXUxNiIsICUiUFJJZDE2IlxuIiwgZmZbMF0sIHV1WzBdLCBpaVswXSk7CgoJcmV0dXJuIDA7Cn0K