utils/type_to_string.hh

00001 // This file is a part of Catsfoot.
00002 // Copyright (C) 2011  Uni Research
00003 //
00004 // This program is free software: you can redistribute it and/or modify
00005 // it under the terms of the GNU Lesser Public License as published by
00006 // the Free Software Foundation, either version 3 of the License, or
00007 // (at your option) any later version.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 // GNU Lesser Public License for more details.
00013 //
00014 // You should have received a copy of the GNU Lesser Public License
00015 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016 
00017 #ifndef __TYPE_TO_STRING_HH
00018 # define __TYPE_TO_STRING_HH
00019 
00020 # include <catsfoot-config.hh>
00021 # ifdef HAVE_CXXABI_H
00022 #  include <cxxabi.h>
00023 #  include <cstdlib>
00024 # endif
00025 # include <string>
00026 
00027 namespace catsfoot {
00028   namespace details {
00029 
00034     template <typename T>
00035     std::string type_to_string() {
00036       std::string ret;
00037 # ifdef HAVE_CXXABI_H
00038       int status;
00039       char* name = abi::__cxa_demangle(typeid(T).name(), 0, 0, &status);
00040       if (status != 0) {
00041 # endif
00042         ret = typeid(T).name();
00043 # ifdef HAVE_CXXABI_H
00044       }
00045       else {
00046         ret = name;
00047         free(name);
00048       }
00049 #endif
00050       return ret;
00051     }
00052 
00053   }
00054 }
00055 
00056 #endif