RecastAlloc.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. #include <stdlib.h>
  19. #include <string.h>
  20. #include "RecastAlloc.h"
  21. #include "RecastAssert.h"
  22. static void *rcAllocDefault(size_t size, rcAllocHint)
  23. {
  24. return malloc(size);
  25. }
  26. static void rcFreeDefault(void *ptr)
  27. {
  28. free(ptr);
  29. }
  30. static rcAllocFunc* sRecastAllocFunc = rcAllocDefault;
  31. static rcFreeFunc* sRecastFreeFunc = rcFreeDefault;
  32. /// @see rcAlloc, rcFree
  33. void rcAllocSetCustom(rcAllocFunc *allocFunc, rcFreeFunc *freeFunc)
  34. {
  35. sRecastAllocFunc = allocFunc ? allocFunc : rcAllocDefault;
  36. sRecastFreeFunc = freeFunc ? freeFunc : rcFreeDefault;
  37. }
  38. /// @see rcAllocSetCustom
  39. void* rcAlloc(size_t size, rcAllocHint hint)
  40. {
  41. return sRecastAllocFunc(size, hint);
  42. }
  43. /// @par
  44. ///
  45. /// @warning This function leaves the value of @p ptr unchanged. So it still
  46. /// points to the same (now invalid) location, and not to null.
  47. ///
  48. /// @see rcAllocSetCustom
  49. void rcFree(void* ptr)
  50. {
  51. if (ptr)
  52. sRecastFreeFunc(ptr);
  53. }
  54. /// @class rcIntArray
  55. ///
  56. /// While it is possible to pre-allocate a specific array size during
  57. /// construction or by using the #resize method, certain methods will
  58. /// automatically resize the array as needed.
  59. ///
  60. /// @warning The array memory is not initialized to zero when the size is
  61. /// manually set during construction or when using #resize.
  62. /// @par
  63. ///
  64. /// Using this method ensures the array is at least large enough to hold
  65. /// the specified number of elements. This can improve performance by
  66. /// avoiding auto-resizing during use.
  67. void rcIntArray::doResize(int n)
  68. {
  69. if (!m_cap) m_cap = n;
  70. while (m_cap < n) m_cap *= 2;
  71. int* newData = (int*)rcAlloc(m_cap*sizeof(int), RC_ALLOC_TEMP);
  72. rcAssert(newData);
  73. if (m_size && newData) memcpy(newData, m_data, m_size*sizeof(int));
  74. rcFree(m_data);
  75. m_data = newData;
  76. }