Factory.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <sofa/helper/Factory.inl>
00028 #include <typeinfo>
00029 #ifdef __GNUC__
00030 #include <cxxabi.h>
00031 #endif
00032 #include <cstdlib>
00033
00034 namespace sofa
00035 {
00036
00037 namespace helper
00038 {
00039
00041 std::string gettypename(const std::type_info& t)
00042 {
00043 std::string name = t.name();
00044 #ifdef __GNUC__
00045 char* realname = NULL;
00046 int status;
00047 realname = abi::__cxa_demangle(name.c_str(), 0, 0, &status);
00048 if (realname!=NULL)
00049 {
00050 name = realname;
00051 free(realname);
00052 }
00053 #endif
00054
00055 for(;;)
00056 {
00057 std::string::size_type pos = name.find("::");
00058 if (pos == std::string::npos) break;
00059 std::string::size_type first = name.find_last_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_",pos-1);
00060 if (first == std::string::npos) first = 0;
00061 else first++;
00062 name.erase(first,pos-first+2);
00063 }
00064
00065 for(;;)
00066 {
00067 std::string::size_type pos = name.find("class ");
00068 if (pos == std::string::npos) break;
00069 name.erase(pos,6);
00070 }
00071 return name;
00072 }
00073
00074
00075 static std::string& getFactoryLog()
00076 {
00077 static std::string s;
00078 return s;
00079 }
00080
00082 void logFactoryRegister(std::string baseclass, std::string classname, std::string key, bool multi)
00083 {
00084 getFactoryLog() += baseclass + (multi?" template class ":" class ")
00085 + classname + " registered as " + key + "\n";
00086 }
00087
00089 void printFactoryLog(std::ostream& out)
00090 {
00091 out << getFactoryLog();
00092 }
00093
00094
00095 }
00096
00097 }
00098