www.pudn.com > ZFXMath-latest.zip > memory.h


/// \file
///
/// \if DE
/// @brief Diverse Speicherfunktionen
/// Funktionen:	ZeroMemory, FillMemory, CopyMemory, MoveMemory
/// \else
/// @brief Some memory functions
/// Functions:	ZeroMemory, FillMemory, CopyMemory, MoveMemory
/// \endif

#ifndef _ZFXMATH_INCLUDE_MEMORY_H_
#define _ZFXMATH_INCLUDE_MEMORY_H_

#include "types.h"

#undef ZeroMemory
#undef FillMemory
#undef CopyMemory
#undef MoveMemory

namespace ZFXMath
{
	/// \if DE
	/// @brief Füllt einen Speicherbereich
	/// Füllt einen Speicherbereich
	/// \param dest [in] Zielbereich
	/// \param count [in] Größe in Byte
	/// \param character [in] Wert
	/// \else
	/// @brief Sets a buffer to a character
	/// Sets a buffer to a character
	/// \param dest [in] destination
	/// \param count [in] size in bytes
	/// \param character [in] value
	/// \endif
    inline void FillMemory(void *dest, unsigned __int32 count, unsigned __int8 character)
    {
        unsigned __int32 size32  = count >> 2;
        unsigned __int32 fill    = (character << 24 | character << 16 | character << 8 | character);
        unsigned __int32 *dest32 = (unsigned __int32*)dest;

        switch ((count - (size32 << 2)))
        {
            case 3: ((unsigned __int8*)dest)[count - 3] = character;
            case 2: ((unsigned __int8*)dest)[count - 2] = character;
            case 1: ((unsigned __int8*)dest)[count - 1] = character;
        }

        while (size32-- > 0)
            *(dest32++) = fill;
    }

	/// \if DE
	/// @brief Füllt einen Speicherbereich mit 0
	/// Füllt einen Speicherbereich mit 0
	/// \param dest [in] Zielbereich
	/// \param count [in] Größe in Byte
	/// \else
	/// @brief Sets a buffer to 0
	/// Sets a buffer to 0
	/// \param dest [in] destination
	/// \param count [in] size in bytes
	/// \endif
	inline void ZeroMemory(void *dest, unsigned __int32 count)
	{
		FillMemory(dest,count,0);
	}

	/// \if DE
	/// @brief Kopiert einen Speicherbereich
	/// Kopiert einen Speicherbereich
	/// \param dest [in] Zielbereich
	/// \param src [in] Quellbereich
	/// \param count [in] Größe in Byte
	/// \else
	/// @brief Copy a buffer to another
	/// Copy a buffer to another
	/// \param dest [in] destination
	/// \param src [in] source
	/// \param count [in] size in bytes
	/// \endif
    inline void CopyMemory(void *dest, const void *src, unsigned __int32 count)
    {
        unsigned __int32    size32    = count >> 2;
        unsigned __int32    *dest32   = (unsigned __int32*)dest;
        unsigned __int32    *src32    = (unsigned __int32*)src;

        switch ((count - (size32 << 2)))
        {
            case 3: ((unsigned __int8*)dest)[count - 3] = ((unsigned __int8*)src)[count - 3];
            case 2: ((unsigned __int8*)dest)[count - 2] = ((unsigned __int8*)src)[count - 2];
            case 1: ((unsigned __int8*)dest)[count - 1] = ((unsigned __int8*)src)[count - 1];
        }

        while (size32-- > 0)
            *(dest32++) = *(src32++);
    }

	/// \if DE
	/// @brief Bewegt einen Speicherbereich
	/// Bewegt einen Speicherbereich
	/// \param dest [in] Zielbereich
	/// \param src [in] Quellbereich
	/// \param count [in] Größe in Byte
	/// \else
	/// @brief Move a buffer
	/// move a buffer
	/// \param dest [in] destination
	/// \param src [in] source
	/// \param count [in] size in bytes
	/// \endif
    inline void MoveMemory(void *dest, const void *src, unsigned __int32 count)
    {
        unsigned __int32    size32    = count >> 2;
        unsigned __int32    *dest32   = (unsigned __int32*)dest;
        unsigned __int32    *src32    = (unsigned __int32*)src;

        if (dest > src)
        {
            switch ((count - (size32 << 2)))
            {
                case 3:
                ((unsigned __int8*)dest)[count - 1] = ((unsigned __int8*)src)[count - 1];
                ((unsigned __int8*)dest)[count - 2] = ((unsigned __int8*)src)[count - 2];
                ((unsigned __int8*)dest)[count - 3] = ((unsigned __int8*)src)[count - 3];
                break;

                case 2:
                ((unsigned __int8*)dest)[count - 1] = ((unsigned __int8*)src)[count - 1];
                ((unsigned __int8*)dest)[count - 2] = ((unsigned __int8*)src)[count - 2];
                break;

                case 1:
                ((unsigned __int8*)dest)[count - 1] = ((unsigned __int8*)src)[count - 1];
                break;
            }

            while (size32-- > 0)
                dest32[size32] = src32[size32];
        }
        else
        {
            for(int i=0; i