#pragma once

#define GETTIME_REALTIME 1
#ifdef MENUQC
float(int tmr) _gettime = #67;
#else
float(int tmr) _gettime = #519;
#endif

ERASEABLE
void profile(string s)
{
	static float g_starttime;
	float rt = _gettime(GETTIME_REALTIME);
	if (!g_starttime) g_starttime = rt;
	LOG_TRACEF("[%f] %s", rt - g_starttime, s);
}

#define _STATIC_INIT(func, where) \
	/* ACCUMULATE void _static_##func##profile() { profile(#func); } */ \
	/* ACCUMULATE_FUNCTION(where, _static_##func##profile) */ \
	ACCUMULATE void _static_##func(); \
	ACCUMULATE_FUNCTION(where, _static_##func) \
	void _static_##func()

/** before worldspawn */
#define STATIC_INIT_EARLY(func) _STATIC_INIT(func##_0,    __static_init_0)
#define static_init_early()     CALL_ACCUMULATED_FUNCTION(__static_init_0)
void __static_init_0() {}

/** during worldspawn */
#define STATIC_INIT(func)       _STATIC_INIT(func##_1,    __static_init_1)
#define static_init()           CALL_ACCUMULATED_FUNCTION(__static_init_1)
void __static_init_1() {}

/** directly after STATIC_INIT */
#define STATIC_INIT_LATE(func)  _STATIC_INIT(func##_2,    __static_init_2)
#define static_init_late()      CALL_ACCUMULATED_FUNCTION(__static_init_2)
void __static_init_2() {}

/** directly after STATIC_INIT_LATE */
#define PRECACHE(func)          _STATIC_INIT(func##_3,    __static_init_3)
#define static_init_precache()  CALL_ACCUMULATED_FUNCTION(__static_init_3)
void __static_init_3() {}

/* other map entities spawn now */

/** before shutdown */
#define SHUTDOWN(func)          _STATIC_INIT(func##_shutdown, __shutdown)
#define shutdownhooks()         CALL_ACCUMULATED_FUNCTION(    __shutdown)
void __shutdown() {}
