123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412 |
- namespace WwiseGTE
- {
- template <typename KeyType, typename ValueType>
- class MinHeap
- {
- public:
- struct Record
- {
- KeyType key;
- ValueType value;
- int index;
- };
-
-
-
- MinHeap(int maxElements = 0)
- {
- Reset(maxElements);
- }
- MinHeap(MinHeap const& minHeap)
- {
- *this = minHeap;
- }
-
- MinHeap& operator=(MinHeap const& minHeap)
- {
- mNumElements = minHeap.mNumElements;
- mRecords = minHeap.mRecords;
- mPointers.resize(minHeap.mPointers.size());
- for (auto& record : mRecords)
- {
- mPointers[record.index] = &record;
- }
- return *this;
- }
-
-
-
- void Reset(int maxElements)
- {
- mNumElements = 0;
- if (maxElements > 0)
- {
- mRecords.resize(maxElements);
- mPointers.resize(maxElements);
- for (int i = 0; i < maxElements; ++i)
- {
- mPointers[i] = &mRecords[i];
- mPointers[i]->index = i;
- }
- }
- else
- {
- mRecords.clear();
- mPointers.clear();
- }
- }
-
-
- inline int GetNumElements() const
- {
- return mNumElements;
- }
-
-
-
- bool GetMinimum(KeyType& key, ValueType& value) const
- {
- if (mNumElements > 0)
- {
- key = mPointers[0]->key;
- value = mPointers[0]->value;
- return true;
- }
- else
- {
- return false;
- }
- }
-
-
-
-
-
-
-
-
-
- Record* Insert(KeyType const& key, ValueType const& value)
- {
-
- if (mNumElements == static_cast<int>(mRecords.size()))
- {
- return nullptr;
- }
-
-
- int child = mNumElements++;
- Record* record = mPointers[child];
- record->key = key;
- record->value = value;
-
-
-
- while (child > 0)
- {
- int parent = (child - 1) / 2;
- if (mPointers[parent]->value <= value)
- {
-
-
- break;
- }
-
-
-
- mPointers[child] = mPointers[parent];
- mPointers[child]->index = child;
-
- mPointers[parent] = record;
- mPointers[parent]->index = parent;
- child = parent;
- }
- return mPointers[child];
- }
-
-
-
-
- bool Remove(KeyType& key, ValueType& value)
- {
-
- if (mNumElements == 0)
- {
- return false;
- }
-
- Record* root = mPointers[0];
- key = root->key;
- value = root->value;
-
-
-
- int last = --mNumElements;
- Record* record = mPointers[last];
- int parent = 0, child = 1;
- while (child <= last)
- {
- if (child < last)
- {
-
-
- int childP1 = child + 1;
- if (mPointers[childP1]->value < mPointers[child]->value)
- {
- child = childP1;
- }
- }
- if (record->value <= mPointers[child]->value)
- {
-
- break;
- }
-
- mPointers[parent] = mPointers[child];
- mPointers[parent]->index = parent;
- parent = child;
- child = 2 * child + 1;
- }
-
-
-
- mPointers[parent] = record;
- mPointers[parent]->index = parent;
-
-
- mPointers[last] = root;
- mPointers[last]->index = last;
- return true;
- }
-
-
-
-
-
- void Update(Record* record, ValueType const& value)
- {
-
- if (!record)
- {
- return;
- }
- int parent, child, childP1, maxChild;
- if (record->value < value)
- {
- record->value = value;
-
-
- parent = record->index;
- child = 2 * parent + 1;
- while (child < mNumElements)
- {
-
-
- childP1 = child + 1;
- if (childP1 < mNumElements)
- {
-
- if (mPointers[child]->value <= mPointers[childP1]->value)
- {
- maxChild = child;
- }
- else
- {
- maxChild = childP1;
- }
- }
- else
- {
-
- maxChild = child;
- }
- if (value <= mPointers[maxChild]->value)
- {
-
-
- break;
- }
-
-
-
- mPointers[parent] = mPointers[maxChild];
- mPointers[parent]->index = parent;
-
- mPointers[maxChild] = record;
- mPointers[maxChild]->index = maxChild;
- parent = maxChild;
- child = 2 * parent + 1;
- }
- }
- else if (value < record->value)
- {
- record->value = value;
-
-
- child = record->index;
- while (child > 0)
- {
-
- parent = (child - 1) / 2;
- if (mPointers[parent]->value <= value)
- {
-
-
- break;
- }
-
-
-
- mPointers[child] = mPointers[parent];
- mPointers[child]->index = child;
-
- mPointers[parent] = record;
- mPointers[parent]->index = parent;
- child = parent;
- }
- }
- }
-
-
- bool IsValid() const
- {
- for (int child = 0; child < mNumElements; ++child)
- {
- int parent = (child - 1) / 2;
- if (parent > 0)
- {
- if (mPointers[child]->value < mPointers[parent]->value)
- {
- return false;
- }
- if (mPointers[parent]->index != parent)
- {
- return false;
- }
- }
- }
- return true;
- }
- private:
-
-
-
-
-
- int mNumElements;
- std::vector<Record> mRecords;
- std::vector<Record*> mPointers;
- };
- }
|