MemViz v1.0.0
C++ Memory Layout Inspector
Loading...
Searching...
No Matches
LayoutInspector.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Macros.hpp"
4#include <iostream>
5#include <cstddef>
6#include <type_traits>
7#include <tuple>
8#include <typeinfo>
9#include <cstdlib>
10#include <cxxabi.h>
11#include <utility>
12#include <string>
13
14template <typename T>
15std::string getObjectType(const T& obj) {
16 try {
17 const char* mangled = typeid(obj).name();
18 int status;
19 char* demangled = abi::__cxa_demangle(mangled, nullptr, nullptr, &status);
20 std::string res = (status == 0 ? demangled : mangled);
21 free(demangled);
22 return res;
23 } catch (const std::bad_typeid&) {
24 return "Unknown";
25 }
26}
27
28template <typename Tuple, typename F, std::size_t... Is>
29void for_each_in_tuple(Tuple&& t, F&& f, std::index_sequence<Is...>) {
30 (f(std::get<Is>(std::forward<Tuple>(t)), Is), ...);
31}
32
33template <typename Tuple, typename F>
34void for_each_in_tuple(Tuple&& t, F&& 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>{});
37}
38
39namespace memviz {
59 template <typename T>
60 static void dumpLayout(const T& obj) {
61 std::cout << "[Layout] Type: " << getObjectType(obj) << "\n";
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";
65
66 if constexpr (requires { MemberInfo<T>::get(); }) {
67 const auto members = MemberInfo<T>::get();
68
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";
71 } else {
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'), ...);
77 }, members);
78 }
79 } else {
80 std::cout << "\033[33m[NOTE]: type not registered — layout fallback only.\033[0m\n";
81 }
82
83 }
84
85
86} // namespace memviz
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