blockalloc.h 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright 2010-2015 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef BX_BLOCKALLOC_H_HEADER_GUARD
  6. #define BX_BLOCKALLOC_H_HEADER_GUARD
  7. #include "bx.h"
  8. namespace bx
  9. {
  10. class BlockAlloc
  11. {
  12. public:
  13. static const uint16_t invalidIndex = 0xffff;
  14. static const uint32_t minElementSize = 2;
  15. BlockAlloc()
  16. : m_data(NULL)
  17. , m_num(0)
  18. , m_size(0)
  19. , m_numFree(0)
  20. , m_freeIndex(invalidIndex)
  21. {
  22. }
  23. BlockAlloc(void* _data, uint16_t _num, uint16_t _size)
  24. : m_data(_data)
  25. , m_num(_num)
  26. , m_size(_size)
  27. , m_numFree(_num)
  28. , m_freeIndex(0)
  29. {
  30. char* data = (char*)_data;
  31. uint16_t* index = (uint16_t*)_data;
  32. for (uint16_t ii = 0; ii < m_num-1; ++ii)
  33. {
  34. *index = ii+1;
  35. data += m_size;
  36. index = (uint16_t*)data;
  37. }
  38. *index = invalidIndex;
  39. }
  40. ~BlockAlloc()
  41. {
  42. }
  43. void* alloc()
  44. {
  45. if (invalidIndex == m_freeIndex)
  46. {
  47. return NULL;
  48. }
  49. void* obj = ( (char*)m_data) + m_freeIndex*m_size;
  50. m_freeIndex = *( (uint16_t*)obj);
  51. --m_numFree;
  52. return obj;
  53. }
  54. void free(void* _obj)
  55. {
  56. uint16_t index = getIndex(_obj);
  57. BX_CHECK(index < m_num, "index %d, m_num %d", index, m_num);
  58. *( (uint16_t*)_obj) = m_freeIndex;
  59. m_freeIndex = index;
  60. ++m_numFree;
  61. }
  62. uint16_t getIndex(void* _obj) const
  63. {
  64. return (uint16_t)( ( (char*)_obj - (char*)m_data ) / m_size);
  65. }
  66. uint16_t getNumFree() const
  67. {
  68. return m_numFree;
  69. }
  70. void* getFromIndex(uint16_t _index)
  71. {
  72. return (char*)m_data + _index*m_size;
  73. }
  74. private:
  75. void* m_data;
  76. uint16_t m_num;
  77. uint16_t m_size;
  78. uint16_t m_numFree;
  79. uint16_t m_freeIndex;
  80. };
  81. } // namespace bx
  82. #endif // BX_BLOCKALLOC_H_HEADER_GUARD