105 lines
2.8 KiB
C++
105 lines
2.8 KiB
C++
/*
|
|
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
|