#pragma once

#ifdef QCC_SUPPORT_ACCUMULATE
	#define ACCUMULATE_FUNCTION(func, otherfunc) \
		ACCUMULATE void func() \
		{ \
			otherfunc(); \
		}
	#define CALL_ACCUMULATED_FUNCTION(func) \
		func()
#else
	#ifdef HAVE_YO_DAWG_CPP
// YO DAWG!
// I HERD YO LIEK MACROS
// SO I PUT A MACRO DEFINITION IN YO MACRO DEFINITION
// SO YO CAN EXPAND MACROS WHILE YO EXPAND MACROS
		#define ACCUMULATE_FUNCTION(func, otherfunc) \
			#ifdef func \
			void __merge__##otherfunc() \
			{ \
				func(); otherfunc(); \
			} \
			#undef func \
			#define func __merge__##otherfunc \
			#else \
				#define func otherfunc \
			#endif
		#define CALL_ACCUMULATED_FUNCTION(func) \
			func()
	#else
		#define ACCUMULATE_FUNCTION(func, otherfunc) \
			.float _ACCUMULATE_##func##__##otherfunc;
		void ACCUMULATE_call(string func)
		{
			int n = numentityfields();
			string name, funcprefix = strcat("_ACCUMULATE_", func, "__");
			float funcprefixlen = strlen(funcprefix);
			for (int i = 0; i < n; ++i)
			{
				name = entityfieldname(i);
				if (substring(name, 0, funcprefixlen) == funcprefix)
					callfunction(substring(name, funcprefixlen, -1));
			}
		}
		#define CALL_ACCUMULATED_FUNCTION(func) \
			ACCUMULATE_call( #func)
	#endif
#endif

// used for simplifying ACCUMULATE_FUNCTIONs
#define SET_FIRST_OR_LAST(input, first, count) \
	if (!input) \
		input = first + count;
#define SET_FIELD_COUNT(field, first, count) \
	if (!field) \
	{ \
		field = first + count; \
		++count; \
	}
#define CHECK_MAX_COUNT(name, max, count, type) \
	if (count > max) \
		error(strcat("Maximum ", type, " hit: ", #name, ": ", ftos(count), ".\n"));
