1 // Copyright 2015 Klemens Morgenstern
3 // This file provides a demangling for function names, i.e. entry points of a dll.
5 // Distributed under the Boost Software License, Version 1.0.
6 // See http://www.boost.org/LICENSE_1_0.txt
8 #ifndef BOOST_DLL_DEMANGLE_SYMBOL_HPP_
9 #define BOOST_DLL_DEMANGLE_SYMBOL_HPP_
11 #include <boost/config.hpp>
15 #if defined(BOOST_MSVC) || defined(BOOST_MSVC_FULL_VER)
24 typedef void * (__cdecl * allocation_function)(std::size_t);
25 typedef void (__cdecl * free_function)(void *);
27 extern "C" char* __unDName( char* outputString,
29 int maxStringLength, // Note, COMMA is leading following optional arguments
30 allocation_function pAlloc,
32 unsigned short disableFlags
36 inline std::string demangle_symbol(const char *mangled_name)
39 allocation_function alloc = [](std::size_t size){return static_cast<void*>(new char[size]);};
40 free_function free_f = [](void* p){delete [] static_cast<char*>(p);};
44 std::unique_ptr<char> name { __unDName(
50 static_cast<unsigned short>(0))};
52 return std::string(name.get());
54 inline std::string demangle_symbol(const std::string& mangled_name)
56 return demangle_symbol(mangled_name.c_str());
63 #include <boost/core/demangle.hpp>
72 inline std::string demangle_symbol(const char *mangled_name)
75 if (*mangled_name == '_')
77 //because it start's with an underline _
78 auto dm = boost::core::demangle(mangled_name);
82 return (mangled_name);
91 //for my personal convinience
92 inline std::string demangle_symbol(const std::string& mangled_name)
94 return demangle_symbol(mangled_name.c_str());
99 namespace experimental
101 using ::boost::dll::detail::demangle_symbol;
108 #endif /* BOOST_DEMANGLE_HPP_ */