summaryrefslogtreecommitdiffstats
path: root/source/core/smart-pointer.h
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2018-09-14 14:16:28 -0400
committerGitHub <noreply@github.com>2018-09-14 14:16:28 -0400
commit3c505c22673701339d35eb2151f01c16eb3c78c3 (patch)
treeff21543fcc846c693cbb6aba43a4e8ae9918f600 /source/core/smart-pointer.h
parente1c934972509f4bbd2c05affe565f91e7a1e6c16 (diff)
Improvements around IR representation and memory usage (#635)
* * Remove dispose from IRInst * Use MemoryArena instead of MemoryPool * Make all IRInst not require Dtor - by having ref counted array store ptrs that need freeing * Increase block size - typically compilation is 2Mb of IR space(!) * Fix issues around StringRepresentation::equal because null has special meaning. * Don't bother to construct as String to compare StringRepresentation, just used UnownedStringSlice. * Added fromLiteral support to UnownedStringSlice and use instead of strlen version. * Use more conventional way to test StringRepresentation against a String. * Fix gcc/clang template problem with cast.
Diffstat (limited to 'source/core/smart-pointer.h')
-rw-r--r--source/core/smart-pointer.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/source/core/smart-pointer.h b/source/core/smart-pointer.h
index f45618050..abd7763ee 100644
--- a/source/core/smart-pointer.h
+++ b/source/core/smart-pointer.h
@@ -61,6 +61,18 @@ namespace Slang
{
return referenceCount;
}
+
+ // Use instead of dynamic_cast as it allows for replacement without using Rtti in the future
+ template<typename T>
+ SLANG_FORCE_INLINE const T* dynamicCast() const
+ {
+ return dynamic_cast<const T*>(this);
+ }
+ template<typename T>
+ SLANG_FORCE_INLINE T* dynamicCast()
+ {
+ return dynamic_cast<T*>(this);
+ }
};
inline void addReference(RefObject* obj)
@@ -78,7 +90,7 @@ namespace Slang
struct RefPtr
{
RefPtr()
- : pointer(0)
+ : pointer(nullptr)
{}
RefPtr(T* p)
@@ -96,7 +108,7 @@ namespace Slang
RefPtr(RefPtr<T>&& p)
: pointer(p.pointer)
{
- p.pointer = 0;
+ p.pointer = nullptr;
}
template <typename U>
@@ -170,8 +182,7 @@ namespace Slang
template<typename U>
RefPtr<U> As() const
{
- RefPtr<U> result(dynamic_cast<U*>(pointer));
- return result;
+ return RefPtr<U>(pointer->template dynamicCast<U>());
}
~RefPtr()