unit_manager.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * Copyright (c) 2012-2016 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "unit_manager.h"
  6. #include "memory.h"
  7. #include "array.h"
  8. #include "queue.h"
  9. #include "world.h"
  10. #define MINIMUM_FREE_INDICES 1024
  11. namespace crown
  12. {
  13. UnitManager::UnitManager(Allocator& a)
  14. : _generation(a)
  15. , _free_indices(a)
  16. , _destroy_callbacks(a)
  17. {
  18. }
  19. UnitId UnitManager::make_unit(uint32_t idx, uint8_t gen)
  20. {
  21. UnitId id = { 0 | idx | uint32_t(gen) << UNIT_INDEX_BITS };
  22. return id;
  23. }
  24. UnitId UnitManager::create()
  25. {
  26. uint32_t idx;
  27. if (queue::size(_free_indices) > MINIMUM_FREE_INDICES)
  28. {
  29. idx = queue::front(_free_indices);
  30. queue::pop_front(_free_indices);
  31. }
  32. else
  33. {
  34. array::push_back(_generation, uint8_t(0));
  35. idx = array::size(_generation) - 1;
  36. CE_ASSERT(idx < (1 << UNIT_INDEX_BITS), "Indices out of bounds");
  37. }
  38. return make_unit(idx, _generation[idx]);
  39. }
  40. UnitId UnitManager::create(World& world)
  41. {
  42. UnitId id = create();
  43. world.spawn_empty_unit(id);
  44. return id;
  45. }
  46. bool UnitManager::alive(UnitId id) const
  47. {
  48. return _generation[id.index()] == id.id();
  49. }
  50. void UnitManager::destroy(UnitId id)
  51. {
  52. const uint32_t idx = id.index();
  53. ++_generation[idx];
  54. queue::push_back(_free_indices, idx);
  55. trigger_destroy_callbacks(id);
  56. }
  57. void UnitManager::register_destroy_function(DestroyFunction fn, void* user_ptr)
  58. {
  59. DestroyData dd;
  60. dd.destroy = fn;
  61. dd.user_ptr = user_ptr;
  62. array::push_back(_destroy_callbacks, dd);
  63. }
  64. void UnitManager::trigger_destroy_callbacks(UnitId id)
  65. {
  66. for (uint32_t i = 0; i < array::size(_destroy_callbacks); ++i)
  67. _destroy_callbacks[i].destroy(id, _destroy_callbacks[i].user_ptr);
  68. }
  69. } // namespace crown