/*
    PIP - Platform Independent Primitives
    Introspection module - interface for containers
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "piintrospection_containers.h"

PIIntrospectionContainersType::~PIIntrospectionContainersType() {
	if (has_demangled) {
		// free((void*)demangled);
		has_demangled = false;
	}
}


#if defined(PIP_INTROSPECTION) && !defined(PIP_FORCE_NO_PIINTROSPECTION)

#  include "piintrospection_containers_p.h"

__PIINTROSPECTION_SINGLETON_CPP__(Containers)

#  ifdef CC_GCC
#	include <cxxabi.h>
const char * demangle(const char * name) {
	int status = -4;
	char * res = abi::__cxa_demangle(name, NULL, NULL, &status);
	if (status == 0) return res;
	return name;
}
#  else
const char * demangle(const char * name) {
	return name;
}
#  endif


void PIIntrospectionContainersType::finish() {
	inited = true;
	if (!name) {
		printf("[PIIntrospectionContainersType::finish] Null name!\n");
		return;
	}
	size_t l = strlen(name);
	if (l > 0) id = piHashData((const uchar *)name, int(l));
	demangled     = demangle(name);
	has_demangled = name != demangled;
	// printf("create typeinfo for %s -> %s\n", name, demangled);
}


PIIntrospectionContainersInterface::PIIntrospectionContainersInterface() {
	p = new PIIntrospectionContainers();
}


PIIntrospectionContainersInterface::~PIIntrospectionContainersInterface() {
	delete p;
}


void PIIntrospectionContainersInterface::containerNew(const PIIntrospectionContainersType & ti, uint isz) {
	p->containerNew(ti, isz);
}


void PIIntrospectionContainersInterface::containerDelete(const PIIntrospectionContainersType & ti) {
	p->containerDelete(ti);
}


void PIIntrospectionContainersInterface::containerAlloc(const PIIntrospectionContainersType & ti, ullong cnt) {
	p->containerAlloc(ti, cnt);
}


void PIIntrospectionContainersInterface::containerFree(const PIIntrospectionContainersType & ti, ullong cnt) {
	p->containerFree(ti, cnt);
}


void PIIntrospectionContainersInterface::containerUsed(const PIIntrospectionContainersType & ti, ullong cnt) {
	p->containerUsed(ti, cnt);
}


void PIIntrospectionContainersInterface::containerUnused(const PIIntrospectionContainersType & ti, ullong cnt) {
	p->containerUnused(ti, cnt);
}

#endif
