17 const char* mangled =
typeid(obj).name();
19 char* demangled = abi::__cxa_demangle(mangled,
nullptr,
nullptr, &status);
20 std::string res = (status == 0 ? demangled : mangled);
23 }
catch (
const std::bad_typeid&) {
28template <
typename Tuple,
typename F, std::size_t... Is>
30 (f(std::get<Is>(std::forward<Tuple>(t)), Is), ...);
33template <
typename Tuple,
typename F>
35 constexpr std::size_t size = std::tuple_size<std::decay_t<Tuple>>::value;
36 for_each_in_tuple(std::forward<Tuple>(t), std::forward<F>(f), std::make_index_sequence<size>{});
60 static void dumpLayout(
const T& obj) {
62 std::cout <<
" Size: " <<
sizeof(T) <<
" bytes\n";
63 std::cout <<
" Alignment: " <<
alignof(T) <<
" bytes\n";
64 std::cout <<
" Location: " <<
static_cast<const void*
>(&obj) <<
"\n";
66 if constexpr (
requires { MemberInfo<T>::get(); }) {
67 const auto members = MemberInfo<T>::get();
69 if constexpr (std::tuple_size<std::remove_cvref_t<
decltype(members)>>::value == 0) {
70 std::cout <<
"\033[33m[NOTE]: use \"MEMVIZ_REGISTER(Type, ...)\" to reflect over members\033[0m\n";
72 std::cout <<
" Members:\n";
73 std::apply([&](
auto&&... pair) {
74 ((std::cout <<
"\t" << pair.first <<
": offset = "
75 <<
reinterpret_cast<const unsigned char*
>(&(obj.*(pair.second)))
76 -
reinterpret_cast<const unsigned char*
>(&obj) <<
'\n'), ...);
80 std::cout <<
"\033[33m[NOTE]: type not registered — layout fallback only.\033[0m\n";
void for_each_in_tuple(Tuple &&t, F &&f, std::index_sequence< Is... >)
Definition LayoutInspector.hpp:29
std::string getObjectType(const T &obj)
Definition LayoutInspector.hpp:15
Definition BitCaster.hpp:5