/**
 * \file AllocateurXMLProperty.cpp
 * Classe de gestion d'un allocateur d'objets XMLProperty.
 * 
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "AllocateurXMLProperty.h"
#include "XMLProperty.h"

#define UNREFERENCED_PARAMETER(P) (P)

/**
 * Constructeur pour un objet AllocateurXMLProperty.
 *
 * @param size La taille d'allocation pour les bancs memoire.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
AllocateurXMLProperty::AllocateurXMLProperty(int size) {
  this->size = size;
  this->sp = 0;
  this->spt = 1;
  t =(XMLProperty **) calloc(1,sizeof(XMLProperty *));
  t[0] = new XMLProperty[size];
}

/**
 * Destructeur pour un objet AllocateurXMLProperty.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
AllocateurXMLProperty::~AllocateurXMLProperty(void) {
  for ( int i = 0 ; i < spt ; i++ ) {
    delete [] t[i]; }
  free(t);
}

/**
 * Allocation d'un objet XMLProperty.
 *
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
XMLProperty *AllocateurXMLProperty::mynew(void) {
  if ( sp >= size ) {
    spt++;
    sp = 0;
    t =(XMLProperty **) realloc(t,spt*sizeof(XMLProperty *));
    if ( !t )
      printf("Out of memory\n");
    t[spt-1] = new XMLProperty[size];
    if ( !t[spt-1] )
      printf("Out of memory\n"); }
  XMLProperty *p = &t[spt-1][sp];
  sp++;
  return(p);
}

/**
 * Retour du nombre de XMLProperty alloues.
 *
 * @return Le nombre de XMLProperty alloues.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
int AllocateurXMLProperty::getNombreXMLPropertyAlloues(void) {
  return((spt-1)*size+sp);
}

/**
 * Retour de la quantite de memoire occupee par this.
 *
 * @return La quantite de memoire occupee par this.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
size_t AllocateurXMLProperty::getUsedMemory(void) {
  size_t mem = sizeof(AllocateurXMLProperty)+spt*sizeof(XMLProperty *);
  for ( int i = 0 ; i < spt ; i++ )
    for ( int j = 0 ; j < size ; j++ )
      mem += t[i][j].getUsedMemory();
  return(mem);
}

/**
 * Retour du nombre de handle memoire occupes par this.
 *
 * @return Le nombre de handle memoire occupes par this.
 * @author Nicolas Janey
 * @author nicolas.janey@univ-fcomte.fr
 * @version 1.0, 01/01/10
 */
long AllocateurXMLProperty::getUsedHandles(void) {
  long mem = 2+spt;
  for ( int i = 0 ; i < spt ; i++ )
    for ( int j = 0 ; j < size ; j++ )
      mem += (t[i][j].getUsedHandles()-1);
  return(mem);
}
