/*
 *  Shinobi Library
 *  Copyright (c) 1998-2000 SEGA
 *  
 *       Multi heap wrapper for Memory Management
 *
 *  Module  : Library Header File
 *  File    : sg_Malcm.h
 *  Create  : 2000-07-26
 *  Modify  : 2000-08-21 J.Terakawa: Align, Header -> SYS_MALCM_ALIGN, SYS_MALCM_HEADER
 *  Version : 1.01
 *  Note    :
 */

#ifndef _SG_MALCM_H_
#define _SG_MALCM_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

typedef struct {
  Sint8 dummy[0x20];
} SYS_MALCM_ALIGN;

typedef union SYS_MALCM_HEADER {
  struct {
    union SYS_MALCM_HEADER *ptr; /* 空きリストの上なら次のブロック */
    Uint32 size;
  } s;
  SYS_MALCM_ALIGN x;
} SYS_MALCM_HEADER;

/* SYS_MALCM_IF
 *  MallocMulti の各APIを置き換えるときに使用する。
 *
 */
struct _SYS_MALCM_HEAPH;

typedef struct _SYS_MALCM_IF {
  Void *(*malloc)(struct _SYS_MALCM_HEAPH *heaph, Uint32 nbytes);
  Void (*free)(struct _SYS_MALCM_HEAPH *heaph, Void *ap);
  Void *(*calloc)(struct _SYS_MALCM_HEAPH *heaph, Uint32 nobj, Uint32 size);
  Void *(*realloc)(struct _SYS_MALCM_HEAPH *heaph, Void *ap, Uint32 nbytes);
} SYS_MALCM_IF;

/* SYS_MALLOC_HEAP_OBJECT:
 *   各ヒープの情報を保持する構造体
 *
 */
typedef struct _SYS_MALCM_HEAPH{
  SYS_MALCM_HEADER  Root;  /* 開始時の空きリスト */
  SYS_MALCM_HEADER *Freep; /* 空きリストの先頭 */
  Uint32  Size;  /* ヒープのサイズ */
  char   *Start; /* ヒープの先頭アドレス */
  struct _SYS_MALCM_IF *mallocIf; /* このヒープで使用するMallocMulti関数群のセット*/
} SYS_MALCM_HEAPH;

Void syMallocMultiCreate(SYS_MALCM_HEAPH *heaph, Void *heap, Uint32 size);

Void syMallocMultiDelete(SYS_MALCM_HEAPH *heaph);

Void *syMallocMulti(SYS_MALCM_HEAPH *heaph, Uint32 nbytes);

void *syReallocMulti(SYS_MALCM_HEAPH *heaph, Void *op, Uint32 nbytes);

void *syCallocMulti(SYS_MALCM_HEAPH *heaph, Uint32 nobj, Uint32 size);

Void syFreeMulti(SYS_MALCM_HEAPH *heaph, Void *ap);

Void syMallocMultiStat(SYS_MALCM_HEAPH *heaph, Uint32 *wholeFreeSize, Uint32 *biggestFreeBlockSize);

SYS_MALCM_IF *syMallocMultiChangeIF(SYS_MALCM_HEAPH *heaph, SYS_MALCM_IF *mallocIF);

#ifdef __cplusplus
	   }
#endif /* __cplusplus */

#endif /* _SG_MALCM_H_ */

/******************************* end of file *******************************/
