mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 19:02:21 +01:00
124 files changed.
This commit is contained in:
63
Project Reboot 3.0/TypeCompatibleBytes.h
Normal file
63
Project Reboot 3.0/TypeCompatibleBytes.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include "inc.h"
|
||||
|
||||
template<int32 Size, uint32 Alignment>
|
||||
struct TAlignedBytes; // this intentionally won't compile, we don't support the requested alignment
|
||||
|
||||
/** Unaligned storage. */
|
||||
template<int32 Size>
|
||||
struct TAlignedBytes<Size, 1>
|
||||
{
|
||||
uint8 Pad[Size];
|
||||
};
|
||||
|
||||
#ifndef GCC_PACK
|
||||
#define GCC_PACK(n)
|
||||
#endif
|
||||
#ifndef GCC_ALIGN
|
||||
#define GCC_ALIGN(n)
|
||||
#endif
|
||||
#ifndef MS_ALIGN
|
||||
#define MS_ALIGN(n)
|
||||
#endif
|
||||
|
||||
// C++/CLI doesn't support alignment of native types in managed code, so we enforce that the element
|
||||
// size is a multiple of the desired alignment
|
||||
#ifdef __cplusplus_cli
|
||||
#define IMPLEMENT_ALIGNED_STORAGE(Align) \
|
||||
template<int32 Size> \
|
||||
struct TAlignedBytes<Size,Align> \
|
||||
{ \
|
||||
uint8 Pad[Size]; \
|
||||
static_assert(Size % Align == 0, "CLR interop types must not be aligned."); \
|
||||
};
|
||||
#else
|
||||
/** A macro that implements TAlignedBytes for a specific alignment. */
|
||||
#define IMPLEMENT_ALIGNED_STORAGE(Align) \
|
||||
template<int32 Size> \
|
||||
struct TAlignedBytes<Size,Align> \
|
||||
{ \
|
||||
struct MS_ALIGN(Align) TPadding \
|
||||
{ \
|
||||
uint8 Pad[Size]; \
|
||||
} GCC_ALIGN(Align); \
|
||||
TPadding Padding; \
|
||||
};
|
||||
#endif
|
||||
|
||||
// Implement TAlignedBytes for these alignments.
|
||||
IMPLEMENT_ALIGNED_STORAGE(16);
|
||||
IMPLEMENT_ALIGNED_STORAGE(8);
|
||||
IMPLEMENT_ALIGNED_STORAGE(4);
|
||||
IMPLEMENT_ALIGNED_STORAGE(2);
|
||||
|
||||
#undef IMPLEMENT_ALIGNED_STORAGE
|
||||
|
||||
template<typename ElementType>
|
||||
struct TTypeCompatibleBytes :
|
||||
public TAlignedBytes<
|
||||
sizeof(ElementType),
|
||||
alignof(ElementType)
|
||||
>
|
||||
{};
|
||||
Reference in New Issue
Block a user