RecastAlloc.cpp 2.6 KB

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