| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #pragma once
- /** Assign value to variable with const modifier
- *
- * This macros is equivalent to `const_cast` from C++
- * Literally x = y, but with some magic.
- * It's as dangerous as only can be.
- * We don't advice you to use it unless you REALLY MUST.
- * Like REALLY REALLY.
- *
- * @param x - const variable
- * @param y - variable
- *
- * @return assigned variable value
- */
- #ifndef FURI_CONST_ASSIGN
- #define FURI_CONST_ASSIGN_(T, x, y) \
- ({ \
- T* tmp_x = (T*)&x; \
- *tmp_x = y; \
- *tmp_x; \
- })
- #define FURI_CONST_ASSIGN_PTR(x, y) \
- ({ \
- void** tmp_x = (void**)&x; \
- *tmp_x = y; \
- *tmp_x; \
- })
- #define FURI_CONST_ASSIGN(x, y) \
- _Generic((x), signed char \
- : FURI_CONST_ASSIGN_(signed char, x, y), unsigned char \
- : FURI_CONST_ASSIGN_(unsigned char, x, y), short \
- : FURI_CONST_ASSIGN_(short, x, y), unsigned short \
- : FURI_CONST_ASSIGN_(unsigned short, x, y), int \
- : FURI_CONST_ASSIGN_(int, x, y), unsigned \
- : FURI_CONST_ASSIGN_(unsigned, x, y), long \
- : FURI_CONST_ASSIGN_(long, x, y), unsigned long \
- : FURI_CONST_ASSIGN_(unsigned long, x, y), long long \
- : FURI_CONST_ASSIGN_(long long, x, y), unsigned long long \
- : FURI_CONST_ASSIGN_(unsigned long long, x, y), float \
- : FURI_CONST_ASSIGN_(float, x, y), double \
- : FURI_CONST_ASSIGN_(double, x, y), long double \
- : FURI_CONST_ASSIGN_(long double, x, y))
- #endif
|