Files
Juliet/Juliet/include/Core/Memory/Utils.h
T

78 lines
5.7 KiB
C

#pragma once
#include <Core/Common/CoreTypes.h>
#include <string.h>
#define ArraySize(array) (sizeof(array) / sizeof((array)[0]))
static inline int32 MemCompare(const void* left_value, const void* right_value, size_t size)
{
const unsigned char* left = (const unsigned char*)left_value;
const unsigned char* right = (const unsigned char*)right_value;
while (size && *left == *right)
{
++left;
++right;
--size;
}
return size ? ((int32)(*left) - (int32)(*right)) : 0;
}
// Single linked list macros
#define SingleLinkedListPushNext(stackTop, node) \
do \
{ \
(node)->Next = (stackTop); \
(stackTop) = (node); \
} \
while (0)
#define SingleLinkedListPushPrevious(stackTop, node) \
do \
{ \
(node)->Previous = (stackTop); \
(stackTop) = (node); \
} \
while (0)
#define SingleLinkedListPopNext(stackTop) \
do \
{ \
(stackTop) = (stackTop)->Next; \
} \
while (0)
// Double linked list queue macro
#define Enqueue(queue, node) \
do \
{ \
if ((queue).First == NULL) \
{ \
(queue).First = (queue).Last = (node); \
(node)->Next = NULL; \
} \
else \
{ \
(queue).Last->Next = (node); \
(queue).Last = (node); \
(node)->Next = NULL; \
} \
(queue).Nodecount += 1; \
} \
while (0)
#define DECLARE_QUEUE(type) \
typedef struct type##Queue type##Queue; \
struct type##Queue \
{ \
type* First; \
type* Last; \
size_t Nodecount; \
size_t Size; \
};
#define MemSet memset
#define MemCopy memcpy
#define MemoryZero(dst, size) MemSet((dst), 0, (size))
#define MemZeroStruct(ptr) MemoryZero((ptr), sizeof(*(ptr)))