Code

Fix version check for wheel selector.
[inkscape.git] / src / gc-anchored.cpp
index 3829e54ddb08e3f0ae1405a0e72a2f431ee43014..0350e6bdda447abece2e1b8c37e4d1cba17221e6 100644 (file)
@@ -12,7 +12,8 @@
 #include <typeinfo>
 #include "gc-anchored.h"
 #include "debug/event-tracker.h"
-#include "debug/event.h"
+#include "debug/simple-event.h"
+#include "debug/demangle.h"
 #include "util/share.h"
 #include "util/format.h"
 
@@ -20,51 +21,39 @@ namespace Inkscape {
 
 namespace GC {
 
-class AnchorEvent : public Debug::Event {
-public:
-    enum Type { ANCHOR, RELEASE };
-
-    AnchorEvent(Anchored const *object, Type type)
-    : _base(Util::format("%p", Core::base(const_cast<Anchored *>(object)))),
-      _object(Util::format("%p", object)),
-      _class_name(Util::share_static_string(typeid(*object).name())),
-      _refcount(Util::format("%d", ( type == ANCHOR ? object->_anchored_refcount() + 1 : object->_anchored_refcount() - 1 ))),
-      _type(type)
-    {}
+namespace {
 
-    static Category category() { return REFCOUNT; }
+typedef Debug::SimpleEvent<Debug::Event::REFCOUNT> RefCountEvent;
 
-    Util::ptr_shared<char> name() const {
-        if ( _type == ANCHOR ) {
-            return Util::share_static_string("gc-anchor");
-        } else {
-            return Util::share_static_string("gc-release");
-        }
-    }
-    unsigned propertyCount() const { return 4; }
-    PropertyPair property(unsigned index) const {
-        switch (index) {
-            case 0:
-                return PropertyPair("base", _base);
-            case 1:
-                return PropertyPair("pointer", _object);
-            case 2:
-                return PropertyPair("class", _class_name);
-            case 3:
-                return PropertyPair("new-refcount", _refcount);
-            default:
-                return PropertyPair();
-        }
+class BaseAnchorEvent : public RefCountEvent {
+public:
+    BaseAnchorEvent(Anchored const *object, int bias,
+                    Util::ptr_shared<char> name)
+    : RefCountEvent(name)
+    {
+        _addProperty("base", Util::format("%p", Core::base(const_cast<Anchored *>(object))));
+        _addProperty("pointer", Util::format("%p", object));
+        _addProperty("class", Debug::demangle(typeid(*object).name()));
+        _addProperty("new-refcount", Util::format("%d", object->_anchored_refcount() + bias));
     }
+};
 
-private:
-    Util::ptr_shared<char> _base;
-    Util::ptr_shared<char> _object;
-    Util::ptr_shared<char> _class_name;
-    Util::ptr_shared<char> _refcount;
-    Type _type;
+class AnchorEvent : public BaseAnchorEvent {
+public:
+    AnchorEvent(Anchored const *object)
+    : BaseAnchorEvent(object, 1, Util::share_static_string("gc-anchor"))
+    {}
 };
 
+class ReleaseEvent : public BaseAnchorEvent {
+public:
+    ReleaseEvent(Anchored const *object)
+    : BaseAnchorEvent(object, -1, Util::share_static_string("gc-release"))
+    {}
+};
+
+}
+
 Anchored::Anchor *Anchored::_new_anchor() const {
     return new Anchor(this);
 }
@@ -74,7 +63,7 @@ void Anchored::_free_anchor(Anchored::Anchor *anchor) const {
 }
 
 void Anchored::anchor() const {
-    Debug::EventTracker<AnchorEvent> tracker(this, AnchorEvent::ANCHOR);
+    Debug::EventTracker<AnchorEvent> tracker(this);
     if (!_anchor) {
         _anchor = _new_anchor();
     }
@@ -82,7 +71,8 @@ void Anchored::anchor() const {
 }
 
 void Anchored::release() const {
-    Debug::EventTracker<AnchorEvent> tracker(this, AnchorEvent::RELEASE);
+    Debug::EventTracker<ReleaseEvent> tracker(this);
+    g_return_if_fail(_anchor);
     if (!--_anchor->refcount) {
         _free_anchor(_anchor);
         _anchor = NULL;
@@ -102,4 +92,4 @@ void Anchored::release() const {
   fill-column:99
   End:
 */
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :