unit_manager.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (c) 2012-2025 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: MIT
  4. */
  5. #include "core/containers/array.inl"
  6. #include "core/containers/queue.inl"
  7. #include "core/list.inl"
  8. #include "world/unit_manager.h"
  9. #include "world/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. {
  17. list::init_head(_callbacks.node);
  18. }
  19. UnitId UnitManager::create()
  20. {
  21. u32 idx;
  22. if (queue::size(_free_indices) > MINIMUM_FREE_INDICES) {
  23. idx = queue::front(_free_indices);
  24. queue::pop_front(_free_indices);
  25. } else {
  26. array::push_back(_generation, u8(0));
  27. idx = array::size(_generation) - 1;
  28. CE_ASSERT(idx < (1 << UNIT_INDEX_BITS), "Indices out of bounds");
  29. }
  30. return make_unit(idx, _generation[idx]);
  31. }
  32. UnitId UnitManager::create(World &world)
  33. {
  34. return world.spawn_empty_unit();
  35. }
  36. bool UnitManager::alive(UnitId unit) const
  37. {
  38. return _generation[unit.index()] == unit.id();
  39. }
  40. void UnitManager::destroy(UnitId unit)
  41. {
  42. const u32 idx = unit.index();
  43. ++_generation[idx];
  44. queue::push_back(_free_indices, idx);
  45. trigger_destroy_callbacks(unit);
  46. }
  47. void UnitManager::register_destroy_callback(UnitDestroyCallback *udc)
  48. {
  49. list::add(udc->node, _callbacks.node);
  50. }
  51. void UnitManager::unregister_destroy_callback(UnitDestroyCallback *udc)
  52. {
  53. list::remove(udc->node);
  54. }
  55. void UnitManager::trigger_destroy_callbacks(UnitId unit)
  56. {
  57. ListNode *cur;
  58. list_for_each(cur, &_callbacks.node)
  59. {
  60. UnitDestroyCallback *udc = (UnitDestroyCallback *)container_of(cur, UnitDestroyCallback, node);
  61. udc->destroy(unit, udc->user_data);
  62. }
  63. }
  64. } // namespace crown