1 // Copyright 2019 Lichao Xia
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 
7 // For more information, see http://www.boost.org
8 
9 #include <boost/config.hpp>
10 
11 #if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L)
12 #include "../example/b2_workarounds.hpp"
13 
14 #include <boost/core/lightweight_test.hpp>
15 #include <boost/dll/smart_library.hpp>
16 #include <boost/filesystem.hpp>
17 
18 #include <iostream>
19 #include <string>
20 
21 class alias;
22 
23 namespace space {
24 template<typename... T>
25 class test_template_class
26 {};
27 
28 template<typename T1,
29          typename T2 = char,
30          typename T3 = test_template_class<int>>
31 class test_template_class_have_default_args
32 {};
33 } // namespace space
34 
35 int
main(int argc,char * argv[])36 main(int argc, char* argv[])
37 {
38   using mangled_storage = boost::dll::detail::mangled_storage_impl;
39   using library = boost::dll::experimental::smart_library;
40 
41   boost::dll::fs::path pt = b2_workarounds::first_lib_from_argv(argc, argv);
42 
43   std::cout << "Library: " << pt << std::endl;
44   //  boost::dll::library_info lib{pt};
45 
46   library lib(pt);
47   mangled_storage ms = lib.symbol_storage();
48   //  mangled_storage ms(lib);
49 
50   std::cout << "Symbols: " << std::endl;
51 
52   for (auto& s : ms.get_storage()) {
53     std::cout << s.demangled << std::endl;
54     std::cout << s.mangled << std::endl;
55     std::cout << std::endl;
56   }
57 
58   std::string v;
59 
60   ms.add_alias<alias>("space::cpp_plugin_type_pasrser");
61 
62   auto ctor1 = ms.get_constructor<alias()>();
63   BOOST_TEST(!ctor1.empty());
64 
65   auto ctor2 = ms.get_constructor<alias(int*)>();
66   BOOST_TEST(!ctor2.empty());
67 
68   auto ctor3 = ms.get_constructor<alias(const int*)>();
69   BOOST_TEST(!ctor3.empty());
70 
71   auto ctor4 = ms.get_constructor<alias(const volatile int*)>();
72   BOOST_TEST(!ctor4.empty());
73 
74   auto ctor5 = ms.get_constructor<alias(const std::string&)>();
75   BOOST_TEST(!ctor5.empty());
76 
77   auto ctor6 = ms.get_constructor<alias(const volatile std::string*)>();
78   BOOST_TEST(!ctor6.empty());
79 
80   v = ms.get_mem_fn<alias, void(int*)>("type_test");
81   BOOST_TEST(!v.empty());
82 
83   v = ms.get_mem_fn<alias, void(const int*)>("type_test");
84   BOOST_TEST(!v.empty());
85 
86   v = ms.get_mem_fn<alias, void(const volatile int*)>("type_test");
87   BOOST_TEST(!v.empty());
88 
89   v = ms.get_mem_fn<alias, void(std::string*)>("type_test");
90   BOOST_TEST(!v.empty());
91 
92   v = ms.get_mem_fn<alias, void(const std::string*)>("type_test");
93   BOOST_TEST(!v.empty());
94 
95   v = ms.get_mem_fn<alias, void(const volatile std::string*)>("type_test");
96   BOOST_TEST(!v.empty());
97 
98   v = ms.get_mem_fn<alias, void(const std::string&)>("type_test");
99   BOOST_TEST(!v.empty());
100 
101   v = ms.get_mem_fn<alias, void(void (*)(const char* volatile))>("type_test");
102   BOOST_TEST(!v.empty());
103 
104   v = ms.get_mem_fn<alias, void(const volatile char* const* volatile*&&)>(
105     "type_test");
106   BOOST_TEST(!v.empty());
107 
108   v = ms.get_mem_fn<const alias, void(const char*)>("type_test");
109   BOOST_TEST(!v.empty());
110 
111   v = ms.get_mem_fn<volatile alias, void(const char*)>("type_test");
112   BOOST_TEST(!v.empty());
113 
114   v = ms.get_mem_fn<const volatile alias, void(const char*)>("type_test");
115   BOOST_TEST(!v.empty());
116 
117   v = ms.get_mem_fn<alias, void(const space::test_template_class<>&)>(
118     "type_test");
119   BOOST_TEST(!v.empty());
120 
121   v = ms.get_mem_fn<alias, void(const space::test_template_class<void(int)>&)>(
122     "type_test");
123   BOOST_TEST(!v.empty());
124 
125   v = ms.get_mem_fn<alias, void(const space::test_template_class<int>&)>(
126     "type_test");
127   BOOST_TEST(!v.empty());
128 
129   v =
130     ms.get_mem_fn<alias, void(const space::test_template_class<std::string>&)>(
131       "type_test");
132   BOOST_TEST(!v.empty());
133 
134   v =
135     ms.get_mem_fn<alias,
136                   void(
137                     const space::test_template_class<char, int, std::string>&)>(
138       "type_test");
139   BOOST_TEST(!v.empty());
140 
141   v =
142     ms.get_mem_fn<alias,
143                   void(
144                     const space::test_template_class_have_default_args<int>&)>(
145       "type_test");
146   BOOST_TEST(!v.empty());
147 
148   v = ms.get_mem_fn<
149     alias,
150     void(const space::test_template_class_have_default_args<int, double>&)>(
151     "type_test");
152   BOOST_TEST(!v.empty());
153 
154   v = ms.get_mem_fn<
155     alias,
156     void(const space::
157            test_template_class_have_default_args<int, double, std::string>&)>(
158     "type_test");
159   BOOST_TEST(!v.empty());
160 
161   auto dtor = ms.get_destructor<alias>();
162 
163   BOOST_TEST(!dtor.empty());
164 
165   return boost::report_errors();
166 }
167 
168 #else
169 int
main()170 main()
171 {
172   return 0;
173 }
174 #endif
175