#pragma once #include #include #ifdef __GNUG__ #include #include #include #endif //#define DDKIT_ENABLE_LIFETIME_LOGGER namespace ddkit { namespace utils { namespace log { template class LifetimeLogger { public: LifetimeLogger() { #ifdef DDKIT_ENABLE_LIFETIME_LOGGER std::cerr << "Constructor of:\t" << typeName() << " @ " << this << std::endl; #endif } ~LifetimeLogger() { #ifdef DDKIT_ENABLE_LIFETIME_LOGGER std::cerr << "Destructor of: \t" << typeName() << " @ " << this << std::endl; #endif } private: std::string typeName() const { #ifdef __GNUG__ const char* mangled = typeid(Type).name(); int status = 0; char* name = abi::__cxa_demangle(mangled, nullptr, nullptr, &status); if(status == 0) { std::string demangledName(name); delete name; return demangledName; } return mangled; #else return typeid(Type).name(); #endif } }; } // namespace log } // namespace utils } // namespace ddkit