// 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() { if (_active) { Logger::finish(); } Logger::start(); _active = true; } template inline void set(A const &a) { if (_active) { Logger::finish(); } Logger::start(a); _active = true; } template inline void set(A const &a, B const &b) { if (_active) { Logger::finish(); } Logger::start(a, b); _active = true; } template inline void set(A const &a, B const &b, C const &c) { if (_active) { Logger::finish(); } Logger::start(a, b, c); _active = true; } template inline void set(A const &a, B const &b, C const &c, D const &d) { if (_active) { Logger::finish(); } Logger::start(a, b, c, d); _active = true; } template inline void set(A const &a, B const &b, C const &c, D const &d, E const &e) { if (_active) { Logger::finish(); } Logger::start(a, b, c, d, e); _active = true; } template inline void set(A const &a, B const &b, C const &c, D const &d, E const &e, F const &f) { if (_active) { Logger::finish(); } Logger::start(a, b, c, d, e, f); _active = true; } template inline void set(A const &a, B const &b, C const &c, D const &d, E const &e, F const &f, G const &g) { if (_active) { Logger::finish(); } Logger::start(a, b, c, d, e, f, g); _active = true; } template inline void set(A const &a, B const &b, C const &c, D const &d, E const &e, F const &f, G const &g, H const &h) { if (_active) { Logger::finish(); } Logger::start(a, b, c, d, e, f, g, h); _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: EventTracker() : EventTrackerBase(true) { Logger::start(); } template EventTracker(A const &a) : EventTrackerBase(true) { Logger::start(a); } template EventTracker(A const &a, B const &b) : EventTrackerBase(true) { Logger::start(a, b); } template EventTracker(A const &a, B const &b, C const &c) : EventTrackerBase(true) { Logger::start(a, b, c); } template EventTracker(A const &a, B const &b, C const &c, D const &d) : EventTrackerBase(true) { Logger::start(a, b, c, d); } template EventTracker(A const &a, B const &b, C const &c, D const &d, E const &e) : EventTrackerBase(true) { Logger::start(a, b, c, d, e); } template EventTracker(A const &a, B const &b, C const &c, D const &d, E const &e, F const &f) : EventTrackerBase(true) { Logger::start(a, b, c, d, e, f); } template EventTracker(A const &a, B const &b, C const &c, D const &d, E const &e, F const &f, G const &g) : EventTrackerBase(true) { Logger::start(a, b, c, d, e, f, g); } template EventTracker(A const &a, B const &b, C const &c, D const &d, E const &e, F const &f, G const &g, H const &h) : EventTrackerBase(true) { Logger::start(a, b, c, d, e, f, g, h); } }; 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 :