/**
 Module with some usefull functions
 */
module mutils.job_manager.utils;

import std.stdio;

void assertKM(A, string file = __FILE__, uint line = __LINE__)(A a, string message="") {
	if (!a) {
		debug writefln("File: %s:%s %s",file,line,message);
		assert(a);
	}
}

void assertM(A, B, string file = __FILE__, uint line = __LINE__)(A a, B b) {
	if (a != b) {
		debug writefln("File: %s:%s  A: %s, B: %s",file,line,a,b);
		assert(a == b);
	}
}

version (linux) {
	import std.conv;
	import std.demangle;
	import core.stdc.string;

	private static struct Dl_info {
		const char* dli_fname;
		void* dli_fbase;
		const char* dli_sname;
		void* dli_saddr;
	}

	private extern (C) int dladdr(void* addr, Dl_info* info);

	string functionName(void* addr) {
		Dl_info info;
		int ret = dladdr(addr, &info);
		return cast(string) info.dli_sname[0 .. strlen(info.dli_sname)];
		//return info.dli_sname.to!(string).demangle;
	}
} else {
	string functionName(void* addr) {
		return "???";
	}
}