// SPDX-License-Identifier: GPL-2.0-or-later /* * Inkscape::Debug::EventTracker - semi-automatically track event lifetimes * * Authors: * MenTaLguY * * Copyright (C) 2005 MenTaLguY * * Released under GNU GPL v2+, read the file 'COPYING' for more information. */ #ifndef SEEN_INKSCAPE_DEBUG_EVENT_TRACKER_H #define SEEN_INKSCAPE_DEBUG_EVENT_TRACKER_H #include "debug/logger.h" namespace Inkscape { namespace Debug { #ifdef NDEBUG // Make event tracking a no-op for non-debug builds template struct EventTracker { template EventTracker(Args &&...) {} template void set(Args &&...) {} void clear() {} }; #else struct NoInitialEvent {}; template class EventTracker; class EventTrackerBase { public: virtual ~EventTrackerBase() { if (_active) { Logger::finish(); } } template inline void set(Args&&... args) { if (_active) { Logger::finish(); } Logger::start(std::forward(args)...); _active = true; } void clear() { if (_active) { Logger::finish(); _active = false; } } protected: EventTrackerBase(bool active) : _active(active) {} private: EventTrackerBase(EventTrackerBase const &) = delete; // no copy void operator=(EventTrackerBase const &) = delete; // no assign bool _active; }; template class EventTracker : public EventTrackerBase { public: template EventTracker(Args&&... args) : EventTrackerBase(true) { Logger::start(std::forward(args)...); } }; template <> class EventTracker : public EventTrackerBase { public: EventTracker() : EventTrackerBase(false) {} }; #endif } } #endif /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :