summaryrefslogtreecommitdiff
path: root/source/core/slang-object-scope-manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/slang-object-scope-manager.h')
-rw-r--r--source/core/slang-object-scope-manager.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/source/core/slang-object-scope-manager.h b/source/core/slang-object-scope-manager.h
new file mode 100644
index 000000000..14008a490
--- /dev/null
+++ b/source/core/slang-object-scope-manager.h
@@ -0,0 +1,67 @@
+#ifndef SLANG_OBJECT_SCOPE_MANAGER_H
+#define SLANG_OBJECT_SCOPE_MANAGER_H
+
+#include "smart-pointer.h"
+#include "list.h"
+
+namespace Slang {
+
+/** Keep objects added in scope.
+
+This is currently about the most simple implementation possible. Objects are added to a list
+which members are released when ObjectScopeManager loses scope, or clear is called.
+
+The same object can be added multiple times. This implementation will just add the same object
+multiple times. A more complex implementation might notice that the object is already in scope
+and not add a reference.
+
+Another potential improvement would be to hold the pointers in a MemoryArena. Doing so would remove
+the requirement of a List of contiguous memory.
+
+In implementations that can hold multiple references to the same thing, we may want to add some
+garbage collection to remove repeat references.
+*/
+struct ObjectScopeManager
+{
+public:
+
+ /// Add an object which will be kept in scope until manager is destroyed
+ SLANG_INLINE RefObject* add(RefObject* obj);
+ /// Add an object, where it may be nullptr. If it null its a no-op
+ SLANG_INLINE RefObject* addMaybeNull(RefObject* obj);
+
+ /// Clear the contents
+ void clear();
+
+ /// Dtor
+ ~ObjectScopeManager() { _releaseAll(); }
+
+protected:
+ void _releaseAll();
+
+ List<RefObject*> m_objs;
+};
+
+// ---------------------------------------------------------------------------
+RefObject* ObjectScopeManager::addMaybeNull(RefObject* obj)
+{
+ if (obj)
+ {
+ obj->addReference();
+ m_objs.Add(obj);
+ }
+ return obj;
+}
+
+// ---------------------------------------------------------------------------
+RefObject* ObjectScopeManager::add(RefObject* obj)
+{
+ SLANG_ASSERT(obj);
+ obj->addReference();
+ m_objs.Add(obj);
+ return obj;
+}
+
+} // namespace Slang
+
+#endif // SLANG_OBJECT_SCOPE_MANAGER_H \ No newline at end of file