src/core/mem_func.hpp
author rubidium
Wed, 09 Jul 2008 13:32:13 +0000
branchnoai
changeset 11126 72d4c9314c72
parent 11044 097ea3e7ec56
permissions -rw-r--r--
(svn r13684) [NoAI] -Sync: with trunk r13599:13683.
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     1
/* $Id$ */
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     2
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     3
/** @file mem_func.hpp Functions related to memory operations. */
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     4
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     5
#ifndef MEM_FUNC_HPP
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     6
#define MEM_FUNC_HPP
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     7
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     8
#include <string.h>
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
     9
#include "math_func.hpp"
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    10
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    11
/**
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    12
 * Type-safe version of memcpy().
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    13
 *
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    14
 * @param destination Pointer to the destination buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    15
 * @param source Pointer to the source buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    16
 * @param num number of items to be copied. (!not number of bytes!)
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    17
 */
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    18
template <typename T>
11126
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    19
static FORCEINLINE void MemCpyT(T *destination, const T *source, uint num = 1)
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    20
{
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    21
	memcpy(destination, source, num * sizeof(T));
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    22
}
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    23
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    24
/**
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    25
 * Type-safe version of memmove().
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    26
 *
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    27
 * @param destination Pointer to the destination buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    28
 * @param source Pointer to the source buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    29
 * @param num number of items to be copied. (!not number of bytes!)
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    30
 */
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    31
template <typename T>
11126
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    32
static FORCEINLINE void MemMoveT(T *destination, const T *source, uint num = 1)
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    33
{
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    34
	memmove(destination, source, num * sizeof(T));
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    35
}
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    36
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    37
/**
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    38
 * Type-safe version of memset().
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    39
 *
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    40
 * @param ptr Pointer to the destination buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    41
 * @param value Value to be set
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    42
 * @param num number of items to be set (!not number of bytes!)
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    43
 */
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    44
template <typename T>
11126
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    45
static FORCEINLINE void MemSetT(T *ptr, int value, uint num = 1)
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    46
{
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    47
	memset(ptr, value, num * sizeof(T));
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    48
}
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    49
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    50
/**
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    51
 * Type-safe version of memcmp().
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    52
 *
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    53
 * @param ptr1 Pointer to the first buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    54
 * @param ptr2 Pointer to the second buffer
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    55
 * @param num Number of items to compare. (!not number of bytes!)
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    56
 * @return an int value indicating the relationship between the content of the two buffers
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    57
 */
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    58
template <typename T>
11126
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    59
static FORCEINLINE int MemCmpT(const T *ptr1, const T *ptr2, uint num = 1)
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    60
{
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    61
	return memcmp(ptr1, ptr2, num * sizeof(T));
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    62
}
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    63
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    64
/**
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    65
 * Type safe memory reverse operation.
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    66
 *  Reverse a block of memory in steps given by the
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    67
 *  type of the pointers.
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    68
 *
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    69
 * @param ptr1 Start-pointer to the block of memory.
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    70
 * @param ptr2 End-pointer to the block of memory.
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    71
 */
11126
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    72
template <typename T>
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    73
static FORCEINLINE void MemReverseT(T *ptr1, T *ptr2)
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    74
{
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    75
	assert(ptr1 != NULL && ptr2 != NULL);
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    76
	assert(ptr1 < ptr2);
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    77
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    78
	do {
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    79
		Swap(*ptr1, *ptr2);
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    80
	} while (++ptr1 < --ptr2);
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    81
}
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    82
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    83
/**
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    84
 * Type safe memory reverse operation (overloaded)
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    85
 *
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    86
 * @param ptr Pointer to the block of memory.
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    87
 * @param num The number of items we want to reverse.
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    88
 */
11126
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    89
template <typename T>
72d4c9314c72 (svn r13684) [NoAI] -Sync: with trunk r13599:13683.
rubidium
parents: 11044
diff changeset
    90
static FORCEINLINE void MemReverseT(T *ptr, uint num)
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    91
{
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    92
	assert(ptr != NULL);
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    93
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    94
	MemReverseT(ptr, ptr + (num - 1));
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    95
}
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    96
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents:
diff changeset
    97
#endif /* MEM_FUNC_HPP */