//Pointer Manager Klasse

template<class type>
class CPointerManager
{
  private:
  int   m_Size;
  int   m_Elements;
  int   m_Counter;
  type*   m_Array;

  public:
  CPointerManager()
  {
    m_Array=NULL;
    m_Elements=1;
    m_Size=m_Counter=0;
  };

  ~CPointerManager()
  {
    if(m_Array) delete[] m_Array;
  };

  type* AllocMemory(int size=1)
  {
    if(m_Array) delete[] m_Array;
    if(size<1||!(m_Array=new type[m_Elements*size])) return NULL;
    else
    {
      m_Size=size;
      m_Counter=0;
      return m_Array;
    }
  };

  void SetNumOfElements(int elements)
  {
    if(m_Array||elements<1) return;
    else m_Elements=elements;
    if(m_Array) delete[] m_Array;
    m_Array=NULL;
  };

  void SetToBegin()
  {
    m_Counter=0;
  };

  type* GetPointer()
  {
    type* p;
    if(!m_Array) return NULL;
    if(m_Counter>=m_Size)
    {
      if(!(p=new type[m_Elements*m_Size*2])) return NULL;
      memcpy(p,m_Array,m_Elements*m_Size);
      delete[] m_Array;
      m_Array=p;
      m_Size*=2;
    }
    p=&m_Array[m_Counter*m_Elements];
    m_Counter++;
    return p;
  };
};

//Globale Variable

CPointerManager<float> pmanager;

//Initialisierung

pmanager.SetNumOfElements(3);
pmanager.AllocMemory(2000);

//Tesselation Callback Combine

void CALLBACK TessCallCombine(GLdouble coords[3],
          void* vertex_data[4],
          GLfloat weight[4],
          void** outData)
{
  float* vert;
  if(!(vert=pmanager.GetPointer())
  {
    //Speicherfehler
  }
  vert[0]=(float)coords[0];
  vert[1]=(float)coords[1];
  vert[2]=(float)coords[2];
  *outData=vert;
}

//Renderfunktion

void Render()
{
  pmanager.SetToBegin();
    -
    -
    -
  return;
}
