summaryrefslogtreecommitdiff
path: root/include/extensible.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/extensible.h')
-rw-r--r--include/extensible.h30
1 files changed, 21 insertions, 9 deletions
diff --git a/include/extensible.h b/include/extensible.h
index bcc4992bb..87fe65ccb 100644
--- a/include/extensible.h
+++ b/include/extensible.h
@@ -17,8 +17,7 @@
*/
-#ifndef EXTENSIBLE_H
-#define EXTENSIBLE_H
+#pragma once
#include <stdint.h>
@@ -85,6 +84,11 @@ class CoreExport Extensible : public classbase
* Holds all extensible metadata for the class.
*/
ExtensibleStore extensions;
+
+ /** True if this Extensible has been culled.
+ * A warning is generated if false on destruction.
+ */
+ unsigned int culled:1;
public:
/**
* Get the extension items for iteraton (i.e. for metadata sync during netburst)
@@ -95,6 +99,11 @@ class CoreExport Extensible : public classbase
virtual CullResult cull();
virtual ~Extensible();
void doUnhookExtensions(const std::vector<reference<ExtensionItem> >& toRemove);
+
+ /**
+ * Free all extension items attached to this Extensible
+ */
+ void FreeAllExtItems();
};
class CoreExport ExtensionManager
@@ -117,7 +126,7 @@ class CoreExport LocalExtItem : public ExtensionItem
virtual void free(void* item) = 0;
};
-template<typename T>
+template <typename T, typename Del = stdalgo::defaultdeleter<T> >
class SimpleExtItem : public LocalExtItem
{
public:
@@ -138,24 +147,28 @@ class SimpleExtItem : public LocalExtItem
{
T* ptr = new T(value);
T* old = static_cast<T*>(set_raw(container, ptr));
- delete old;
+ Del del;
+ del(old);
}
inline void set(Extensible* container, T* value)
{
T* old = static_cast<T*>(set_raw(container, value));
- delete old;
+ Del del;
+ del(old);
}
inline void unset(Extensible* container)
{
T* old = static_cast<T*>(unset_raw(container));
- delete old;
+ Del del;
+ del(old);
}
virtual void free(void* item)
{
- delete static_cast<T*>(item);
+ Del del;
+ del(static_cast<T*>(item));
}
};
@@ -175,6 +188,7 @@ class CoreExport LocalIntExt : public LocalExtItem
std::string serialize(SerializeFormat format, const Extensible* container, void* item) const;
intptr_t get(const Extensible* container) const;
intptr_t set(Extensible* container, intptr_t value);
+ void unset(Extensible* container) { set(container, 0); }
void free(void* item);
};
@@ -190,5 +204,3 @@ class CoreExport StringExtItem : public ExtensionItem
void unset(Extensible* container);
void free(void* item);
};
-
-#endif