cpp_mangle_test.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Copyright 2016 Klemens Morgenstern
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt
  5. // or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. // For more information, see http://www.boost.org
  7. #include <boost/predef.h>
  8. #if (__cplusplus >= 201402L) || (BOOST_COMP_MSVC >= BOOST_VERSION_NUMBER(14,0,0))
  9. #include "../example/b2_workarounds.hpp"
  10. #include <boost/dll/smart_library.hpp>
  11. #include <boost/core/lightweight_test.hpp>
  12. #include <boost/filesystem.hpp>
  13. #include <boost/variant.hpp>
  14. #include <iostream>
  15. struct override_class {};
  16. int main(int argc, char* argv[])
  17. {
  18. using namespace boost::dll;
  19. using mangled_storage = detail::mangled_storage_impl;
  20. boost::dll::fs::path pt = b2_workarounds::first_lib_from_argv(argc, argv);;
  21. std::cout << "Library: " << pt << std::endl;
  22. library_info lib{pt};
  23. mangled_storage ms(lib);
  24. std::cout << "Symbols: " << std::endl;
  25. for (auto &s : ms.get_storage())
  26. {
  27. std::cout << s.demangled << std::endl;
  28. }
  29. std::string v;
  30. v = ms.get_variable<double>("some_space::variable");
  31. BOOST_TEST(!v.empty()); //check if a symbols was found.
  32. BOOST_TEST(v != "some_space::variable"); //demangle is different
  33. v = ms.get_variable<double>("some_space::variable_typo");
  34. BOOST_TEST(v.empty());
  35. v = ms.get_variable<const double>("unscoped_c_var");
  36. BOOST_TEST(!v.empty()); //check if a symbols was found.
  37. v = ms.get_variable<int>("unscoped_var");
  38. BOOST_TEST(!v.empty()); //check if a symbols was found.
  39. v = ms.get_function<const int &()>("some_space::scoped_fun");
  40. BOOST_TEST(!v.empty());
  41. BOOST_TEST(v != "some_space::scoped_fun");
  42. auto v1 = ms.get_function<void(const double)>("overloaded");
  43. auto v2 = ms.get_function<void(const volatile int)>("overloaded");
  44. BOOST_TEST(!v1.empty());
  45. BOOST_TEST(!v2.empty());
  46. BOOST_TEST(v1 != v2);
  47. v = ms.get_variable<int>("some_space::some_class::value");
  48. BOOST_TEST(!v.empty());
  49. BOOST_TEST(v != "some_space::some_class::value");
  50. v = ms.get_function<void(const int &)>("some_space::some_class::set_value");
  51. BOOST_TEST(!v.empty());
  52. BOOST_TEST(v != "some_space::some_class::set_value");
  53. ms.add_alias<override_class>("some_space::some_class");
  54. auto ctor1 = ms.get_constructor<override_class()>();
  55. BOOST_TEST(!ctor1.empty());
  56. auto ctor2 = ms.get_constructor<override_class(int)>();
  57. BOOST_TEST(!ctor2.empty());
  58. v = ms.get_mem_fn<override_class, double(double, double)>("func");
  59. BOOST_TEST(!v.empty());
  60. v = ms.get_mem_fn<override_class, int(int, int)>("func");
  61. BOOST_TEST(!v.empty());
  62. auto dtor = ms.get_destructor<override_class>();
  63. BOOST_TEST(!dtor.empty());
  64. auto var1 = ms.get_function<void(boost::variant<int, double> &)>("use_variant");
  65. auto var2 = ms.get_function<void(boost::variant<double, int> &)>("use_variant");
  66. BOOST_TEST(!var1.empty());
  67. BOOST_TEST(!var2.empty());
  68. // TODO: FIX!
  69. #ifndef BOOST_TRAVISCI_BUILD
  70. #if defined(BOOST_MSVC) || defined(BOOST_MSVC_VER)
  71. auto vtable = ms.get_vtable<override_class>();
  72. BOOST_TEST(!vtable.empty());
  73. #else
  74. auto ti = ms.get_type_info<override_class>();
  75. BOOST_TEST(!ti.empty());
  76. #endif
  77. #endif // #ifndef BOOST_TRAVISCI_BUILD
  78. return boost::report_errors();
  79. }
  80. #else
  81. int main() {return 0;}
  82. #endif