diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2018-10-30 15:31:27 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-30 15:31:27 -0400 |
| commit | baf06088dff0b961843ad03efd75ff009befec5c (patch) | |
| tree | 6720c4b5015ff50dd14d7654d5d3fdae01a6ef7e /source/core/slang-object-scope-manager.h | |
| parent | 2a7644980035bfda0aab00f183154ab7e976ba63 (diff) | |
Feature/serial string pool refactor (#702)
* Ongoing serialization for full debug work.
* Use StringRepresentationCache and StringSlicePool for serialization.
* Removed some older path handling for serialization which had some wrong underlying assumptions.
* Builds with refactored use of SubStringPool in ir-serialize.
* Removed prohibitedCategories because not used anywhere.
* Add category 'compatibility-issue'
* Remove work in progress on debug serialization.
Diffstat (limited to 'source/core/slang-object-scope-manager.h')
| -rw-r--r-- | source/core/slang-object-scope-manager.h | 67 |
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 |
