Advertisement
expired6978

NET1

Mar 10th, 2014
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. bool NiObjectNET::InsertExtraData(NiExtraData* extraData)
  2. {
  3.     if (!extraData)
  4.         return false;
  5.  
  6.     extraData->IncRef();
  7.  
  8.     if (m_extraDataCapacity < 1)
  9.     {
  10.         m_extraDataLen = m_extraDataCapacity = 1;
  11.         m_extraData = (NiExtraData**)FormHeap_Allocate(sizeof(NiExtraData*) * m_extraDataCapacity);
  12.         m_extraData[0] = extraData;
  13.         return true;
  14.     }
  15.     else if (m_extraDataLen == m_extraDataCapacity) // Increase size
  16.     {
  17.         m_extraDataCapacity = (m_extraDataCapacity * 2) + 1;
  18.         NiExtraData** pNewExtraData = (NiExtraData**)FormHeap_Allocate(sizeof(NiExtraData*) * m_extraDataCapacity);
  19.  
  20.         UInt16 uiDestSize = m_extraDataCapacity * sizeof(NiExtraData*);
  21.         memcpy_s(pNewExtraData, uiDestSize, m_extraData, m_extraDataLen * sizeof(NiExtraData*));
  22.  
  23.         FormHeap_Free(m_extraData);
  24.         m_extraData = pNewExtraData;
  25.     }
  26.  
  27.     UInt16 i = 0;
  28.  
  29.     m_extraData[m_extraDataLen] = extraData;    // Insert
  30.     m_extraDataLen++;
  31.  
  32.     for (i = m_extraDataLen; i < m_extraDataCapacity; i++)
  33.         m_extraData[i] = NULL;
  34.  
  35.     for (i = (m_extraDataLen - 1); i > 0; i--)   // Sort
  36.     {
  37.         ptrdiff_t dtCompare = m_extraData[i - 1]->m_pcName - m_extraData[i]->m_pcName;
  38.         if (dtCompare == 0)  // Delete equal key
  39.         {
  40.             DeleteExtraData(i);
  41.             return false;
  42.         }
  43.         else if (dtCompare > 0)  // Swap
  44.         {
  45.             NiExtraData* pkTmpED = m_extraData[i - 1];
  46.             m_extraData[i - 1] = m_extraData[i];
  47.             m_extraData[i] = pkTmpED;
  48.         }
  49.         else
  50.             break; // Sorted
  51.     }
  52.  
  53.     return true;
  54. }
  55.  
  56. void NiObjectNET::DeleteExtraData(UInt16 index)
  57. {
  58.     if (index >= m_extraDataLen)
  59.         return;
  60.  
  61.     if (m_extraData[index])
  62.         m_extraData[index]->DecRef();
  63.  
  64.     // Shuffle downward.
  65.     for (UInt16 i = index; i < (m_extraDataLen - 1); i++)
  66.     {
  67.         m_extraData[i] = m_extraData[i + 1];
  68.     }
  69.  
  70.     m_extraDataLen--;
  71.     m_extraData[m_extraDataLen] = NULL;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement