memory.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. #pragma once
  2. #include <util/system/defaults.h>
  3. #include <algorithm>
  4. #include <functional>
  5. #include <utility>
  6. template <class T>
  7. inline bool IsZero(const T* begin, const T* end) {
  8. return std::find_if(begin, end, [](const T& other) { return other != T(0); }) == end;
  9. }
  10. template <size_t Size>
  11. inline bool IsZero(const char* p) {
  12. size_t sizeInUI64 = Size / 8;
  13. const char* pEndUi64 = p + sizeInUI64 * 8;
  14. if (sizeInUI64 && !IsZero<ui64>((const ui64*)p, (const ui64*)pEndUi64)) {
  15. return false;
  16. }
  17. return IsZero(pEndUi64, p + Size);
  18. }
  19. #define IS_ZERO_INTSZ(INT) \
  20. template <> \
  21. inline bool IsZero<sizeof(INT)>(const char* p) { \
  22. return (*(INT*)p) == INT(0); \
  23. }
  24. IS_ZERO_INTSZ(ui8)
  25. IS_ZERO_INTSZ(ui16)
  26. IS_ZERO_INTSZ(ui32)
  27. IS_ZERO_INTSZ(ui64)
  28. #undef IS_ZERO_INTSZ
  29. // If you want to use this to check all fields in a struct make sure it's w/o holes or #pragma pack(1)
  30. template <class T>
  31. bool IsZero(const T& t) {
  32. return IsZero<sizeof(T)>((const char*)&t);
  33. }