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

/* Pour les nouveaux numeros d'identificateurs d'objects */
uint32 current_obj_num = 0;

/*****************************************************************/
/* Renvoi le numero de type qui correspond a un object tout con  */
/* chaque autre type d'object (button, window...) doit avoir son */
/* propre numero ainsi que sa propre fonction sur le meme type.  */
uint32 object_type(void)
{ static uint32 object_type_num = 0;

  if(object_type_num == 0)
  {
    object_type_num = object_num_new;
  }
  return(object_type_num);
}
/*****************************************************************/

void object_free(obj_ofs *this)
{
  free(this);
}

/***********************************************************/
/* initialise un object (utile pour les object qui herite) */
/* qui doivent appeler init avant de faire leur propre     */
/* initialisation specifique ou de surcharge.              */
void object_init(obj_ofs *this)
{ int i;
  object *vobject;

  /* si on veut acceder a un champ de object */
  for(i=0;(this[i].obj_type != 0) && (this[i].obj_type != object_type());i++);
  
  /* on peut meme faire une petite verification dynamique de l'objet       */
  /* pour verifier si cet objet peut bien etre considere comme un "object" */
  if(this[i].obj_type == 0)
  {
    fprintf(stderr,"object_init (object.c) : invalide object\n");
    exit(2);
  }
  vobject = (object *)this[i].ofs;
  /* on initialise les attributs et les methodes */
  vobject->free = object_free;
}
/***********************************************************/

/******************/
/* cree un object */
obj_ofs *object_new(void)
{ obj_ofs *vobj_table;
  pointer mem;

  /* allocation de la memoire pour l'objet */
  if((mem = (pointer)malloc(sizeof(obj_ofs)*2+sizeof(object))) == NULL)
  { perror("malloc failed "); exit(1); }

  /* table des objets */
  vobj_table = (obj_ofs *)mem;

  /* pour la partie uniquement object */
  vobj_table[0].obj_type = object_type();
  vobj_table[0].ofs      = mem + sizeof(obj_ofs)*2;

  /* le dernier sert a delimiter la table des objets                */
  /* aucun objet n'est identifie par la clee 0 donc pas d'ambiguite */
  vobj_table[1].obj_type = 0;

  /* on fait appel au constructeur de l'objet object */
  object_init(vobj_table);

  /* et voila un nouvel objet */
  return(vobj_table);
}
/******************/