⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recyclingarray.h

📁 游戏音频程序设计-Beginning.Game.Audio.Programming
💻 H
字号:
#include <stdexcept>
#include <vector>
#include "CommonFuncs.h"

template <class TArrayElement, int iNumElements> class CRecyclingArray 
{
public:
  CRecyclingArray()
  {
    for(int q=0; q < iNumElements; q++) {
      m_bAlive[q] = false;
    }
    m_iUsedElements = 0;
    m_iLastNew = 0;
  }

  virtual ~CRecyclingArray() { }

  TArrayElement *New()
  {
    // assert that we have space for this one
    if (GetNumFreeElements() < 1) throw(std::out_of_range("CRecyclingArray::New: too many objects!"));

    // find first element not in use.  as an optimization, we start at
    // the position that was allocated last, in the hopes that the next position
    // will be free.

    int i = m_iLastNew;
    for (int q=0; q < iNumElements; q++) {
      if (!m_bAlive[i]) {
        // we've found our free spot!  use it!
        break;
      }
      else {
        i++; if (i >= iNumElements) i = 0;
      }
    }

    if (m_bAlive[i]) {
      // huh? if we got here, there are no free elements in the list... yet 
      // GetNumFreeElements didn't tell us that in the beginning.  Logic error.
      throw(std::logic_error("TArrayElement::New(): internal logic error."));
    }

    // clear it
    m_aElements[i] = m_NewTemplate;

    // increment used count
    m_iUsedElements++;
    m_bAlive[i] = true;
    m_iLastNew = i;
    
    // return it
    return(&m_aElements[i]);
  }

  bool Delete(int index)
  {
    if (index < 0 || index >= iNumElements || !m_bAlive[index]) return false;
    // don't actually delete element at index;
    // just mark it free.
    m_bAlive[index] = false;
    m_iUsedElements--;
    return true;
  }

  bool Delete(TArrayElement *elem)
  {
    if (m_iUsedElements == 0) return(false);
    int iElem = reinterpret_cast<int>(elem);
    iElem -= reinterpret_cast<int>(&m_aElements[0]);
    int index = iElem / sizeof(TArrayElement);
    if (index < 0 || index >= iNumElements || !m_bAlive[index]) return(false);
    m_bAlive[index] = false;
    m_iUsedElements--;
    return(true);
  }

  int GetNumFreeElements(void) { return(iNumElements-GetNumUsedElements()); }
  int GetNumUsedElements(void) { return(m_iUsedElements); }

  int GetTotalElements(void) { return(iNumElements); }

  TArrayElement &GetAt(int index) { return(m_aElements[index]); }
  bool IsAlive(int index) { return(m_bAlive[index]); }

  void DeleteAll(void)
  {
    for (int q=0; q < iNumElements; q++) {
      m_bAlive[q] = false;
    }
    m_iUsedElements = 0;
    m_iLastNew = 0;
  }

protected:
  int m_iUsedElements;
  TArrayElement m_aElements[iNumElements]; 
  bool m_bAlive[iNumElements];
  int m_iLastNew;
  TArrayElement m_NewTemplate;

};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -