12 #ifndef hifi_EntityPriorityQueue_h
13 #define hifi_EntityPriorityQueue_h
16 #include <unordered_set>
18 #include "EntityItem.h"
21 class PrioritizedEntity {
23 static constexpr
float DO_NOT_SEND { -1.0e6f };
24 static constexpr
float FORCE_REMOVE { -1.0e5f };
25 static constexpr
float WHEN_IN_DOUBT_PRIORITY { 1.0f };
27 PrioritizedEntity(EntityItemPointer entity,
float priority,
bool forceRemove =
false) : _weakEntity(entity), _rawEntityPointer(entity.get()), _priority(priority), _forceRemove(forceRemove) {}
28 EntityItemPointer getEntity()
const {
return _weakEntity.lock(); }
29 EntityItem* getRawEntityPointer()
const {
return _rawEntityPointer; }
30 float getPriority()
const {
return _priority; }
31 bool shouldForceRemove()
const {
return _forceRemove; }
35 bool operator() (
const PrioritizedEntity& A,
const PrioritizedEntity& B) {
return A._priority < B._priority; }
40 EntityItemWeakPointer _weakEntity;
46 class EntityPriorityQueue {
48 inline bool empty()
const {
49 assert(_queue.empty() == _entities.empty());
50 return _queue.empty();
53 inline const PrioritizedEntity& top()
const {
54 assert(!_queue.empty());
58 inline bool contains(
const EntityItem* entity)
const {
59 return _entities.find(entity) != std::end(_entities);
62 inline void emplace(
const EntityItemPointer& entity,
float priority,
bool forceRemove =
false) {
63 assert(entity && !contains(entity.get()));
64 _queue.emplace(entity, priority, forceRemove);
65 _entities.insert(entity.get());
66 assert(_queue.size() == _entities.size());
71 _entities.erase(_queue.top().getRawEntityPointer());
73 assert(_queue.size() == _entities.size());
76 inline void swap(EntityPriorityQueue& other) {
77 std::swap(_queue, other._queue);
78 std::swap(_entities, other._entities);
82 using PriorityQueue = std::priority_queue<PrioritizedEntity,
83 std::vector<PrioritizedEntity>,
84 PrioritizedEntity::Compare>;
88 std::unordered_set<const EntityItem*> _entities;
Definition: EntityItem.h:82