Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void NiObjectNET::AddExtraData(NiExtraData * extraData)
- {
- extraData->IncRef();
- // No capacity, allocate and grow
- UInt32 newSize = 0;
- if(m_extraDataCapacity == 0) {
- newSize = 1;
- NiExtraData ** extraDataList = (NiExtraData **)FormHeap_Allocate(newSize * sizeof(NiExtraData*));
- extraDataList[0] = extraData;
- m_extraData = extraDataList;
- m_extraDataCapacity = newSize;
- m_extraDataLen = m_extraDataCapacity;
- return;
- }
- // Reached capacity, reallocate and grow
- if(m_extraDataLen == m_extraDataCapacity) {
- newSize = (m_extraDataCapacity * 2) + 1;
- NiExtraData ** extraDataList = (NiExtraData **)FormHeap_Allocate(newSize * sizeof(NiExtraData*));
- // Copy the entries over
- memcpy_s(extraDataList, newSize * sizeof(NiExtraData*), m_extraData, m_extraDataLen * sizeof(NiExtraData*));
- // Zero the allocated entries
- for(UInt16 i = m_extraDataLen; i < newSize; i++)
- extraDataList[i] = NULL;
- FormHeap_Free(m_extraData);
- m_extraData = extraDataList;
- m_extraDataCapacity = newSize;
- }
- m_extraData[++m_extraDataLen] = extraData;
- qsort(m_extraData, m_extraDataLen, sizeof(NiExtraData*), ExtraDataCompare);
- }
- SInt32 NiObjectNET::GetIndexOf(NiExtraData * extraData)
- {
- if(!extraData)
- return -1;
- if(!extraData->m_pcName)
- return -1;
- UInt16 min = 0;
- UInt16 max = m_extraDataLen;
- SInt32 r = -1;
- while (max >= min) { // Iterative binary search
- UInt16 mid = (min + max) >> 1;
- if(m_extraData[mid]->m_pcName == extraData->m_pcName)
- r = mid; // Found entry
- else if (m_extraData[mid]->m_pcName < extraData->m_pcName)
- min = mid + 1;
- else
- max = mid - 1;
- }
- return r;
- }
- bool NiObjectNET::RemoveExtraData(NiExtraData * extraData)
- {
- UInt16 min = 0;
- UInt16 max = m_extraDataLen;
- SInt32 index = GetIndexOf(extraData);
- if(index >= 0) { // Remove the entry
- extraData->DecRef();
- // Shift everything up
- for (UInt16 i = index; i < m_extraDataLen - 1; i++)
- m_extraData[i] = m_extraData[i + 1];
- // Remove the duplicate tail entry
- m_extraData[--m_extraDataLen] = NULL;
- return true;
- }
- return false;
- }
- NiExtraData * NiObjectNET::GetExtraData(const char * name)
- {
- UInt16 min = 0;
- UInt16 max = m_extraDataLen;
- while (max >= min) { // Iterative binary search
- UInt16 mid = (min + max) >> 1;
- if(m_extraData[mid]->m_pcName == name)
- return m_extraData[mid];
- else if (m_extraData[mid]->m_pcName < name)
- min = mid + 1;
- else
- max = mid - 1;
- }
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement