svn merge ^/trunk/blender -r40644:40720
[blender-staging.git] / extern / recastnavigation / Recast / Source / RecastAlloc.cpp
1 //
2 // Copyright (c) 2009-2010 Mikko Mononen memon@inside.org
3 //
4 // This software is provided 'as-is', without any express or implied
5 // warranty.  In no event will the authors be held liable for any damages
6 // arising from the use of this software.
7 // Permission is granted to anyone to use this software for any purpose,
8 // including commercial applications, and to alter it and redistribute it
9 // freely, subject to the following restrictions:
10 // 1. The origin of this software must not be misrepresented; you must not
11 //    claim that you wrote the original software. If you use this software
12 //    in a product, an acknowledgment in the product documentation would be
13 //    appreciated but is not required.
14 // 2. Altered source versions must be plainly marked as such, and must not be
15 //    misrepresented as being the original software.
16 // 3. This notice may not be removed or altered from any source distribution.
17 //
18
19 #include <stdlib.h>
20 #include <string.h>
21 #include "RecastAlloc.h"
22
23 static void *rcAllocDefault(int size, rcAllocHint)
24 {
25         return malloc(size);
26 }
27
28 static void rcFreeDefault(void *ptr)
29 {
30         free(ptr);
31 }
32
33 static rcAllocFunc* sRecastAllocFunc = rcAllocDefault;
34 static rcFreeFunc* sRecastFreeFunc = rcFreeDefault;
35
36 /// @see rcAlloc, rcFree
37 void rcAllocSetCustom(rcAllocFunc *allocFunc, rcFreeFunc *freeFunc)
38 {
39         sRecastAllocFunc = allocFunc ? allocFunc : rcAllocDefault;
40         sRecastFreeFunc = freeFunc ? freeFunc : rcFreeDefault;
41 }
42
43 /// @see rcAllocSetCustom
44 void* rcAlloc(int size, rcAllocHint hint)
45 {
46         return sRecastAllocFunc(size, hint);
47 }
48
49 /// @par
50 ///
51 /// @warning This function leaves the value of @p ptr unchanged.  So it still
52 /// points to the same (now invalid) location, and not to null.
53 /// 
54 /// @see rcAllocSetCustom
55 void rcFree(void* ptr)
56 {
57         if (ptr)
58                 sRecastFreeFunc(ptr);
59 }
60
61 /// @class rcIntArray
62 ///
63 /// While it is possible to pre-allocate a specific array size during 
64 /// construction or by using the #resize method, certain methods will 
65 /// automatically resize the array as needed.
66 ///
67 /// @warning The array memory is not initialized to zero when the size is 
68 /// manually set during construction or when using #resize.
69
70 /// @par
71 ///
72 /// Using this method ensures the array is at least large enough to hold
73 /// the specified number of elements.  This can improve performance by
74 /// avoiding auto-resizing during use.
75 void rcIntArray::resize(int n)
76 {
77         if (n > m_cap)
78         {
79                 if (!m_cap) m_cap = n;
80                 while (m_cap < n) m_cap *= 2;
81                 int* newData = (int*)rcAlloc(m_cap*sizeof(int), RC_ALLOC_TEMP);
82                 if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int));
83                 rcFree(m_data);
84                 m_data = newData;
85         }
86         m_size = n;
87 }
88