/*
 * デバッグ用ルーチン
 */

#ifndef MINATO_DEBUG_H
#define MINATO_DEBUG_H

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

#ifndef MDEBUG

#   define CHECKML_BEGIN()
#   define CHECKML_END()  

#   define MALLOC(o) malloc(o)
#   define STRDUP(o) strdup(o)
#   define REALLOC(o, o2) realloc(o, o2)
#   define FREE(o) free(o)

#   define TIMER_BEGIN(msg)
#   define TIMER_END()

#else

/* メモリリークチェック用関数 */
void CheckMemLeak_Begin();      // 初期化
void CheckMemLeak_End();        // 解放
ALLOC void* CheckMemLeak_Malloc(size_t size, const char* file_name, int line, const char* func_name);
    // メモリリークチェック用メモリアロケート
ALLOC char* CheckMemLeak_Strdup(char* str, const char* file_name, int line, const char* func_name);
    // メモリリークチェック用文字列割り当て
ALLOC void* CheckMemLeak_Realloc(void* ptr, size_t size, const char* file_name, int line, const char* func_name);
    // メモリリークチェック用リアロック
void CheckMemLeak_Free(MANAGED void* memory, const char* file_name, int line, const char* func_name);
    // メモリリークチェック用フリー
 
void timer_count_start(char* msg);
void timer_count_end(const char* file, int line, const char* fun);

/* デバッグ用定数定義 */
#   define CHECKML_BEGIN() CheckMemLeak_Begin();
#   define CHECKML_END() CheckMemLeak_End(); 

#   define MALLOC(o) CheckMemLeak_Malloc(o, __FILE__, __LINE__, __FUNCTION__)
#   define STRDUP(o) CheckMemLeak_Strdup(o, __FILE__, __LINE__, __FUNCTION__)
#   define REALLOC(o, o2) CheckMemLeak_Realloc(o, o2, __FILE__, __LINE__, __FUNCTION__)
#   define FREE(o) CheckMemLeak_Free(o, __FILE__, __LINE__, __FUNCTION__)

#   define TIMER_BEGIN(msg) timer_count_start(msg)
#   define TIMER_END() timer_count_end(__FILE__, __LINE__, __FUNCTION__)

#endif

#endif
