78 lines
5.7 KiB
C
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)))
|