AlignedData.hpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #ifndef CORE_ALIGNED_DATA_HPP
  2. #define CORE_ALIGNED_DATA_HPP
  3. #include "core/utils/Types.hpp"
  4. #define CORE_ASSERT_ALIGNED_DATA(var, type) \
  5. static_assert(sizeof(var) == sizeof(type), "aligned data size missmatch"); \
  6. static_assert(decltype(var)::getSize() >= decltype(var)::getAlignment(), \
  7. "size >= alignment"); \
  8. static_assert(alignof(decltype(var)) == alignof(type), \
  9. "aligned data alignment missmatch");
  10. namespace Core {
  11. template<size_t SIZE, size_t ALIGNMENT>
  12. class alignas(ALIGNMENT) AlignedData final {
  13. char buffer[SIZE] = {};
  14. public:
  15. template<typename T>
  16. constexpr T* as() {
  17. return reinterpret_cast<T*>(this);
  18. }
  19. template<typename T>
  20. constexpr const T* as() const {
  21. return reinterpret_cast<T*>(this);
  22. }
  23. static consteval size_t getSize() {
  24. return SIZE;
  25. }
  26. static consteval size_t getAlignment() {
  27. return ALIGNMENT;
  28. }
  29. };
  30. template<typename T>
  31. using AlignedType = AlignedData<sizeof(T), alignof(T)>;
  32. }
  33. #endif