dangerous_defines.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #pragma once
  2. /** Assign value to variable with const modifier
  3. *
  4. * This macros is equivalent to `const_cast` from C++
  5. * Literally x = y, but with some magic.
  6. * It's as dangerous as only can be.
  7. * We don't advice you to use it unless you REALLY MUST.
  8. * Like REALLY REALLY.
  9. *
  10. * @param x - const variable
  11. * @param y - variable
  12. *
  13. * @return assigned variable value
  14. */
  15. #ifndef FURI_CONST_ASSIGN
  16. #define FURI_CONST_ASSIGN_(T, x, y) \
  17. ({ \
  18. T* tmp_x = (T*)&x; \
  19. *tmp_x = y; \
  20. *tmp_x; \
  21. })
  22. #define FURI_CONST_ASSIGN_PTR(x, y) \
  23. ({ \
  24. void** tmp_x = (void**)&x; \
  25. *tmp_x = y; \
  26. *tmp_x; \
  27. })
  28. #define FURI_CONST_ASSIGN(x, y) \
  29. _Generic((x), signed char \
  30. : FURI_CONST_ASSIGN_(signed char, x, y), unsigned char \
  31. : FURI_CONST_ASSIGN_(unsigned char, x, y), short \
  32. : FURI_CONST_ASSIGN_(short, x, y), unsigned short \
  33. : FURI_CONST_ASSIGN_(unsigned short, x, y), int \
  34. : FURI_CONST_ASSIGN_(int, x, y), unsigned \
  35. : FURI_CONST_ASSIGN_(unsigned, x, y), long \
  36. : FURI_CONST_ASSIGN_(long, x, y), unsigned long \
  37. : FURI_CONST_ASSIGN_(unsigned long, x, y), long long \
  38. : FURI_CONST_ASSIGN_(long long, x, y), unsigned long long \
  39. : FURI_CONST_ASSIGN_(unsigned long long, x, y), float \
  40. : FURI_CONST_ASSIGN_(float, x, y), double \
  41. : FURI_CONST_ASSIGN_(double, x, y), long double \
  42. : FURI_CONST_ASSIGN_(long double, x, y))
  43. #endif