#ifndef H_KINO_MEMMANAGER
#define H_KINO_MEMMANAGER 1

#include "charmony.h"
#include <stdlib.h>

#define KINO_MALLOCATE(n,t) \
    (t*)malloc((n)*sizeof(t))
#define KINO_CALLOCATE(n,t) \
    (t*)calloc((n),sizeof(t))
#define KINO_REALLOCATE(v,n,t) \
    (t*)realloc((v), (n)*sizeof(t))

/* malloc() an object, assign its vtable and give it an initial refcount of 1.
 */
#define KINO_CREATE(var, type, vtable) \
    type *var     = KINO_MALLOCATE(1, type); \
    var->_        = &vtable; \
    var->refcount = 1;

/* Alternative to CREATE, which creates a subclass when [class_name] is
 * non-NULL.
 */
#define KINO_CREATE_SUBCLASS(var, class_name, type, vtable) \
    type *var = KINO_MALLOCATE(1, type); \
    if (   class_name == NULL \
        || (strcmp(class_name, vtable.class_name) == 0) \
    ) { \
        var->_ = &vtable; \
    } \
    else { \
        var->_ = (vtable##_VTABLE*)kino_DynVT_singleton(class_name, \
            (KINO_OBJ_VTABLE*)&vtable, sizeof(vtable)); \
    } \
    var->refcount = 1;

#ifdef KINO_USE_SHORT_NAMES
  #define MALLOCATE(n,t)                  KINO_MALLOCATE(n,t)
  #define CALLOCATE(n,t)                  KINO_CALLOCATE(n,t)
  #define REALLOCATE(v,n,t)               KINO_REALLOCATE(v,n,t)
  #define CREATE(v,t,vt)                  KINO_CREATE(v,t,vt)
  #define CREATE_SUBCLASS(v,c,t,vt)       KINO_CREATE_SUBCLASS(v,c,t,vt)
#endif

#endif /* H_KINO_MEMMANAGER */

/* Copyright 2006-2007 Marvin Humphrey
 *
 * This program is free software; you can redistribute it and/or modify
 * under the same terms as Perl itself.
 */