Advertisement
expired6978

NET2

Mar 10th, 2014
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. bool NiObjectNET::InsertExtraData(NiExtraData* pkExtra)
  2. {
  3.     if (!pkExtra)
  4.     {
  5.         return false;
  6.     }
  7.  
  8.     pkExtra->IncRefCount();
  9.  
  10.     if (m_usMaxSize < 1)
  11.     {
  12.         m_usExtraDataSize = m_usMaxSize = 1;
  13.         m_ppkExtra = NiAlloc(NiExtraData*, m_usMaxSize);
  14.         m_ppkExtra[0] = pkExtra;
  15.         return true;
  16.     }
  17.     else if (m_usExtraDataSize == m_usMaxSize)
  18.     {
  19.         // Array is full.  Increase size.
  20.         m_usMaxSize = (m_usMaxSize * 2) + 1; // Balance memory fragmentation
  21.                                              //    with storage efficiency.
  22.         NiExtraData** ppkNewExtra = NiAlloc(NiExtraData*, m_usMaxSize);
  23.  
  24.         unsigned int uiDestSize = m_usMaxSize * sizeof(NiExtraData*);
  25.         NiMemcpy(ppkNewExtra, uiDestSize, m_ppkExtra,
  26.             m_usExtraDataSize * sizeof(NiExtraData*));
  27.  
  28.         NiFree(m_ppkExtra);
  29.         m_ppkExtra = ppkNewExtra;
  30.     }
  31.  
  32.     unsigned short i;
  33.  
  34.     m_ppkExtra[m_usExtraDataSize] = pkExtra;    // Insert new entry.
  35.     m_usExtraDataSize++;
  36.  
  37.     for (i = m_usExtraDataSize; i < m_usMaxSize; i++)
  38.     {
  39.         m_ppkExtra[i] = NULL;
  40.     }
  41.  
  42.     for (i = (m_usExtraDataSize - 1); i > 0; i--)   // Sort.
  43.     {
  44.         ptrdiff_t dtCompare = m_ppkExtra[i - 1]->GetName() -
  45.             m_ppkExtra[i]->GetName();
  46.  
  47.         if (dtCompare == 0)  // Equal keys are a problem.  Reset.
  48.         {
  49. #ifndef __SPU__
  50.             NiOutputDebugString(
  51.                 "Error:  unsuccessful attempt to insert ExtraData with ");
  52.             NiOutputDebugString(
  53.                 "same key (name) for same object.\n");
  54. #endif
  55.             DeleteExtraData(i);
  56.  
  57.             return false;
  58.         }
  59.         else if (dtCompare > 0)  // Previous key is greater.  Swap.
  60.         {
  61.             NiExtraData* pkTmpED = m_ppkExtra[i - 1];
  62.             m_ppkExtra[i - 1] = m_ppkExtra[i];
  63.             m_ppkExtra[i] = pkTmpED;
  64.         }
  65.         else    // Array is sorted.  Discontinue processing.
  66.         {
  67.             break;
  68.         }
  69.     }
  70.  
  71.     return true;
  72. }
  73.  
  74. void NiObjectNET::DeleteExtraData(unsigned short usExtraDataIndex)
  75. {
  76.     if (usExtraDataIndex >= m_usExtraDataSize)  // Sanity check.
  77.     {
  78.         return;
  79.     }
  80.  
  81.     if (m_ppkExtra[usExtraDataIndex])
  82.     {
  83.         m_ppkExtra[usExtraDataIndex]->DecRefCount();
  84.     }
  85.  
  86.     // Shuffle downward.
  87.     for (unsigned short i = usExtraDataIndex;
  88.         i < (m_usExtraDataSize - 1); i++)
  89.     {
  90.         m_ppkExtra[i] = m_ppkExtra[i + 1];
  91.     }
  92.  
  93.     m_usExtraDataSize--;
  94.     m_ppkExtra[m_usExtraDataSize] = NULL;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement