00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#ifndef _ZFXMATH_INCLUDE_MEMORY_H_
00012
#define _ZFXMATH_INCLUDE_MEMORY_H_
00013
00014
#include "types.h"
00015
00016
#undef ZeroMemory
00017
#undef FillMemory
00018
#undef CopyMemory
00019
#undef MoveMemory
00020
00021
namespace ZFXMath
00022 {
00036 inline void FillMemory(
void *dest,
unsigned __int32 count,
unsigned __int8 character)
00037 {
00038
unsigned __int32 size32 = count >> 2;
00039
unsigned __int32 fill = (character << 24 | character << 16 | character << 8 | character);
00040
unsigned __int32 *dest32 = (
unsigned __int32*)dest;
00041
00042
switch ((count - (size32 << 2)))
00043 {
00044
case 3: ((
unsigned __int8*)dest)[count - 3] = character;
00045
case 2: ((
unsigned __int8*)dest)[count - 2] = character;
00046
case 1: ((
unsigned __int8*)dest)[count - 1] = character;
00047 }
00048
00049
while (size32-- > 0)
00050 *(dest32++) = fill;
00051 }
00052
00064 inline void ZeroMemory(
void *dest,
unsigned __int32 count)
00065 {
00066
FillMemory(dest,count,0);
00067 }
00068
00082 inline void CopyMemory(
void *dest,
const void *src,
unsigned __int32 count)
00083 {
00084
unsigned __int32 size32 = count >> 2;
00085
unsigned __int32 *dest32 = (
unsigned __int32*)dest;
00086
unsigned __int32 *src32 = (
unsigned __int32*)src;
00087
00088
switch ((count - (size32 << 2)))
00089 {
00090
case 3: ((
unsigned __int8*)dest)[count - 3] = ((
unsigned __int8*)src)[count - 3];
00091
case 2: ((
unsigned __int8*)dest)[count - 2] = ((
unsigned __int8*)src)[count - 2];
00092
case 1: ((
unsigned __int8*)dest)[count - 1] = ((
unsigned __int8*)src)[count - 1];
00093 }
00094
00095
while (size32-- > 0)
00096 *(dest32++) = *(src32++);
00097 }
00098
00112 inline void MoveMemory(
void *dest,
const void *src,
unsigned __int32 count)
00113 {
00114
unsigned __int32 size32 = count >> 2;
00115
unsigned __int32 *dest32 = (
unsigned __int32*)dest;
00116
unsigned __int32 *src32 = (
unsigned __int32*)src;
00117
00118
if (dest > src)
00119 {
00120
switch ((count - (size32 << 2)))
00121 {
00122
case 3:
00123 ((
unsigned __int8*)dest)[count - 1] = ((
unsigned __int8*)src)[count - 1];
00124 ((
unsigned __int8*)dest)[count - 2] = ((
unsigned __int8*)src)[count - 2];
00125 ((
unsigned __int8*)dest)[count - 3] = ((
unsigned __int8*)src)[count - 3];
00126
break;
00127
00128
case 2:
00129 ((
unsigned __int8*)dest)[count - 1] = ((
unsigned __int8*)src)[count - 1];
00130 ((
unsigned __int8*)dest)[count - 2] = ((
unsigned __int8*)src)[count - 2];
00131
break;
00132
00133
case 1:
00134 ((
unsigned __int8*)dest)[count - 1] = ((
unsigned __int8*)src)[count - 1];
00135
break;
00136 }
00137
00138
while (size32-- > 0)
00139 dest32[size32] = src32[size32];
00140 }
00141
else
00142 {
00143
for(
int i=0; i<size32; ++i)
00144 *(dest32++) = *(src32++);
00145
00146
switch ((count - (size32 << 2)))
00147 {
00148
case 3: *(dest32++) = *(src32++);
00149
case 2: *(dest32++) = *(src32++);
00150
case 1: *(dest32++) = *(src32++);
00151 }
00152 }
00153 }
00154 }
00155
00156
#endif //_ZFXMATH_INCLUDE_MEMORY_H_
00157
00158