memory.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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. return IsZero(pEndUi64, p + Size);
  17. }
  18. #define IS_ZERO_INTSZ(INT) \
  19. template <> \
  20. inline bool IsZero<sizeof(INT)>(const char* p) { \
  21. return (*(INT*)p) == INT(0); \
  22. }
  23. IS_ZERO_INTSZ(ui8)
  24. IS_ZERO_INTSZ(ui16)
  25. IS_ZERO_INTSZ(ui32)
  26. IS_ZERO_INTSZ(ui64)
  27. #undef IS_ZERO_INTSZ
  28. // If you want to use this to check all fields in a struct make sure it's w/o holes or #pragma pack(1)
  29. template <class T>
  30. bool IsZero(const T& t) {
  31. return IsZero<sizeof(T)>((const char*)&t);
  32. }