summaryrefslogtreecommitdiffstats
path: root/src/display/control/canvas-item-ptr.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/display/control/canvas-item-ptr.h')
-rw-r--r--src/display/control/canvas-item-ptr.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/display/control/canvas-item-ptr.h b/src/display/control/canvas-item-ptr.h
new file mode 100644
index 0000000..b8c198c
--- /dev/null
+++ b/src/display/control/canvas-item-ptr.h
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#ifndef SEEN_CANVAS_ITEM_PTR_H
+#define SEEN_CANVAS_ITEM_PTR_H
+
+/*
+ * An entirely analogous file to display/drawing-item-ptr.h.
+ */
+
+#include <memory>
+#include <type_traits>
+
+namespace Inkscape { class CanvasItem; }
+
+/// Deleter object which calls the unlink() method of CanvasItem.
+struct CanvasItemUnlinkDeleter
+{
+ template <typename T>
+ void operator()(T *t)
+ {
+ static_assert(std::is_base_of_v<Inkscape::CanvasItem, T>);
+ t->unlink();
+ }
+};
+
+/// Smart pointer used to hold CanvasItems, like std::unique_ptr.
+template <typename T>
+using CanvasItemPtr = std::unique_ptr<T, CanvasItemUnlinkDeleter>;
+
+/// Convienence function to create a CanvasItemPtr, like std::make_unique.
+template <typename T, typename... Args>
+auto make_canvasitem(Args&&... args)
+{
+ return CanvasItemPtr<T>(new T(std::forward<Args>(args)...));
+};
+
+#endif // SEEN_CANVAS_ITEM_PTR_H