summaryrefslogtreecommitdiffstats
path: root/source/core/smart-pointer.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/smart-pointer.h')
-rw-r--r--source/core/smart-pointer.h755
1 files changed, 376 insertions, 379 deletions
diff --git a/source/core/smart-pointer.h b/source/core/smart-pointer.h
index f1fece2e5..d307e4e13 100644
--- a/source/core/smart-pointer.h
+++ b/source/core/smart-pointer.h
@@ -3,466 +3,463 @@
#include "type-traits.h"
-namespace CoreLib
+namespace Slang
{
- namespace Basic
+ class RefPtrDefaultDestructor
{
- class RefPtrDefaultDestructor
+ public:
+ template<typename T>
+ void operator ()(T * ptr)
{
- public:
- template<typename T>
- void operator ()(T * ptr)
- {
- delete ptr;
- }
- };
+ delete ptr;
+ }
+ };
- class RefPtrArrayDestructor
+ class RefPtrArrayDestructor
+ {
+ public:
+ template<typename T>
+ void operator() (T * ptr)
{
- public:
- template<typename T>
- void operator() (T * ptr)
- {
- delete [] ptr;
- }
- };
+ delete [] ptr;
+ }
+ };
- class ReferenceCounted
- {
- template<typename T, bool b, typename Destructor>
- friend class RefPtrImpl;
- private:
- int _refCount = 0;
- public:
- ReferenceCounted() {}
- ReferenceCounted(const ReferenceCounted &)
- {
- _refCount = 0;
- }
- };
+ class ReferenceCounted
+ {
+ template<typename T, bool b, typename Destructor>
+ friend class RefPtrImpl;
+ private:
+ int _refCount = 0;
+ public:
+ ReferenceCounted() {}
+ ReferenceCounted(const ReferenceCounted &)
+ {
+ _refCount = 0;
+ }
+ };
- class RefObject : public ReferenceCounted
- {
- public:
- virtual ~RefObject()
- {}
- };
+ class RefObject : public ReferenceCounted
+ {
+ public:
+ virtual ~RefObject()
+ {}
+ };
- template<typename T, bool HasBuiltInCounter, typename Destructor>
- class RefPtrImpl
- {
- };
+ template<typename T, bool HasBuiltInCounter, typename Destructor>
+ class RefPtrImpl
+ {
+ };
- template<typename T, typename Destructor = RefPtrDefaultDestructor>
- using RefPtr = RefPtrImpl<T, IsBaseOf<ReferenceCounted, T>::Value, Destructor>;
+ template<typename T, typename Destructor = RefPtrDefaultDestructor>
+ using RefPtr = RefPtrImpl<T, IsBaseOf<ReferenceCounted, T>::Value, Destructor>;
- template<typename T, typename Destructor>
- class RefPtrImpl<T, 0, Destructor>
- {
- template<typename T1, bool b, typename Destructor1>
- friend class RefPtrImpl;
- private:
- T * pointer;
- int * refCount;
+ template<typename T, typename Destructor>
+ class RefPtrImpl<T, 0, Destructor>
+ {
+ template<typename T1, bool b, typename Destructor1>
+ friend class RefPtrImpl;
+ private:
+ T * pointer;
+ int * refCount;
- public:
- RefPtrImpl()
- {
- pointer = 0;
- refCount = 0;
- }
- RefPtrImpl(T * ptr)
- : pointer(0), refCount(0)
- {
- this->operator=(ptr);
- }
- RefPtrImpl(const RefPtrImpl<T, 0, Destructor> & ptr)
- : pointer(0), refCount(0)
+ public:
+ RefPtrImpl()
+ {
+ pointer = 0;
+ refCount = 0;
+ }
+ RefPtrImpl(T * ptr)
+ : pointer(0), refCount(0)
+ {
+ this->operator=(ptr);
+ }
+ RefPtrImpl(const RefPtrImpl<T, 0, Destructor> & ptr)
+ : pointer(0), refCount(0)
+ {
+ this->operator=(ptr);
+ }
+ RefPtrImpl(RefPtrImpl<T, 0, Destructor> && str)
+ : pointer(0), refCount(0)
+ {
+ this->operator=(static_cast<RefPtrImpl<T, 0, Destructor> &&>(str));
+ }
+
+ template <typename U>
+ RefPtrImpl(const RefPtrImpl<U, 0, Destructor>& ptr,
+ typename EnableIf<IsConvertible<T*, U*>::Value, void>::type * = 0)
+ : pointer(0), refCount(0)
+ {
+ pointer = ptr.pointer;
+ if (ptr)
{
- this->operator=(ptr);
+ refCount = ptr.refCount;
+ (*refCount)++;
}
- RefPtrImpl(RefPtrImpl<T, 0, Destructor> && str)
- : pointer(0), refCount(0)
+ else
+ refCount = 0;
+ }
+
+ template <typename U>
+ typename EnableIf<IsConvertible<T*, U*>::value, RefPtrImpl<T, 0, Destructor>>::type&
+ operator=(const RefPtrImpl<U,0,Destructor> & ptr)
+ {
+ Unreference();
+
+ pointer = ptr;
+ if (ptr)
{
- this->operator=(static_cast<RefPtrImpl<T, 0, Destructor> &&>(str));
+ refCount = ptr.refCount;
+ (*refCount)++;
}
+ else
+ refCount = 0;
+ return *this;
+ }
- template <typename U>
- RefPtrImpl(const RefPtrImpl<U, 0, Destructor>& ptr,
- typename EnableIf<IsConvertible<T*, U*>::Value, void>::type * = 0)
- : pointer(0), refCount(0)
+ RefPtrImpl<T, 0, Destructor>& operator=(const RefPtrImpl<T, 0, Destructor> & ptr)
+ {
+ Unreference();
+ pointer = ptr.pointer;
+ if (ptr)
{
- pointer = ptr.pointer;
- if (ptr)
- {
- refCount = ptr.refCount;
- (*refCount)++;
- }
- else
- refCount = 0;
+ refCount = ptr.refCount;
+ (*refCount)++;
}
+ else
+ refCount = 0;
+ return *this;
+ }
- template <typename U>
- typename EnableIf<IsConvertible<T*, U*>::value, RefPtrImpl<T, 0, Destructor>>::type&
- operator=(const RefPtrImpl<U,0,Destructor> & ptr)
+ RefPtrImpl<T, 0, Destructor>& operator=(T * ptr)
+ {
+ if (ptr != pointer)
{
Unreference();
pointer = ptr;
if (ptr)
{
- refCount = ptr.refCount;
- (*refCount)++;
+ refCount = new int;
+ (*refCount) = 1;
}
else
refCount = 0;
- return *this;
}
-
- RefPtrImpl<T, 0, Destructor>& operator=(const RefPtrImpl<T, 0, Destructor> & ptr)
+ return *this;
+ }
+ int GetHashCode()
+ {
+ return (int)(long long)(void*)pointer;
+ }
+ bool operator == (const T * ptr) const
+ {
+ return pointer == ptr;
+ }
+ bool operator != (const T * ptr) const
+ {
+ return pointer != ptr;
+ }
+ template<typename U>
+ bool operator == (const RefPtr<U, Destructor> & ptr) const
+ {
+ return pointer == ptr.pointer;
+ }
+ template<typename U>
+ bool operator != (const RefPtr<U, Destructor> & ptr) const
+ {
+ return pointer != ptr.pointer;
+ }
+ template<typename U>
+ RefPtrImpl<U, 0, Destructor> As() const
+ {
+ RefPtrImpl<U, 0, Destructor> result;
+ if (pointer)
{
- Unreference();
- pointer = ptr.pointer;
- if (ptr)
+ result.pointer = dynamic_cast<U*>(pointer);
+ if (result.pointer)
{
- refCount = ptr.refCount;
+ result.refCount = refCount;
(*refCount)++;
}
- else
- refCount = 0;
- return *this;
}
+ return result;
+ }
- RefPtrImpl<T, 0, Destructor>& operator=(T * ptr)
- {
- if (ptr != pointer)
- {
- Unreference();
-
- pointer = ptr;
- if (ptr)
- {
- refCount = new int;
- (*refCount) = 1;
- }
- else
- refCount = 0;
- }
- return *this;
- }
- int GetHashCode()
- {
- return (int)(long long)(void*)pointer;
- }
- bool operator == (const T * ptr) const
- {
- return pointer == ptr;
- }
- bool operator != (const T * ptr) const
- {
- return pointer != ptr;
- }
- template<typename U>
- bool operator == (const RefPtr<U, Destructor> & ptr) const
- {
- return pointer == ptr.pointer;
- }
- template<typename U>
- bool operator != (const RefPtr<U, Destructor> & ptr) const
- {
- return pointer != ptr.pointer;
- }
- template<typename U>
- RefPtrImpl<U, 0, Destructor> As() const
- {
- RefPtrImpl<U, 0, Destructor> result;
- if (pointer)
- {
- result.pointer = dynamic_cast<U*>(pointer);
- if (result.pointer)
- {
- result.refCount = refCount;
- (*refCount)++;
- }
- }
- return result;
- }
-
- T* operator +(int offset) const
- {
- return pointer+offset;
- }
- T& operator [](int idx) const
+ T* operator +(int offset) const
+ {
+ return pointer+offset;
+ }
+ T& operator [](int idx) const
+ {
+ return *(pointer + idx);
+ }
+ RefPtrImpl<T, 0, Destructor>& operator=(RefPtrImpl<T, 0, Destructor> && ptr)
+ {
+ if(ptr.pointer != pointer)
{
- return *(pointer + idx);
+ Unreference();
+ pointer = ptr.pointer;
+ refCount = ptr.refCount;
+ ptr.pointer = 0;
+ ptr.refCount = 0;
}
- RefPtrImpl<T, 0, Destructor>& operator=(RefPtrImpl<T, 0, Destructor> && ptr)
+ return *this;
+ }
+ T* Release()
+ {
+ if(pointer)
{
- if(ptr.pointer != pointer)
+ if((*refCount) > 1)
{
- Unreference();
- pointer = ptr.pointer;
- refCount = ptr.refCount;
- ptr.pointer = 0;
- ptr.refCount = 0;
+ (*refCount)--;
}
- return *this;
- }
- T* Release()
- {
- if(pointer)
+ else
{
- if((*refCount) > 1)
- {
- (*refCount)--;
- }
- else
- {
- delete refCount;
- }
+ delete refCount;
}
- auto rs = pointer;
- refCount = 0;
- pointer = 0;
- return rs;
- }
- ~RefPtrImpl()
- {
- Unreference();
}
+ auto rs = pointer;
+ refCount = 0;
+ pointer = 0;
+ return rs;
+ }
+ ~RefPtrImpl()
+ {
+ Unreference();
+ }
- void Unreference()
+ void Unreference()
+ {
+ if(pointer)
{
- if(pointer)
+ if((*refCount) > 1)
{
- if((*refCount) > 1)
- {
- (*refCount)--;
- }
- else
- {
- Destructor destructor;
- destructor(pointer);
- delete refCount;
- }
+ (*refCount)--;
}
- }
- T & operator *() const
- {
- return *pointer;
- }
- T * operator->() const
- {
- return pointer;
- }
- T * Ptr() const
- {
- return pointer;
- }
- public:
- explicit operator bool() const
- {
- if (pointer)
- return true;
else
- return false;
+ {
+ Destructor destructor;
+ destructor(pointer);
+ delete refCount;
+ }
}
- };
+ }
+ T & operator *() const
+ {
+ return *pointer;
+ }
+ T * operator->() const
+ {
+ return pointer;
+ }
+ T * Ptr() const
+ {
+ return pointer;
+ }
+ public:
+ explicit operator bool() const
+ {
+ if (pointer)
+ return true;
+ else
+ return false;
+ }
+ };
- template<typename T, typename Destructor>
- class RefPtrImpl<T, 1, Destructor>
- {
- template<typename T1, bool b, typename Destructor1>
- friend class RefPtrImpl;
+ template<typename T, typename Destructor>
+ class RefPtrImpl<T, 1, Destructor>
+ {
+ template<typename T1, bool b, typename Destructor1>
+ friend class RefPtrImpl;
- private:
- T * pointer;
- public:
- RefPtrImpl()
- {
- pointer = 0;
- }
- RefPtrImpl(T * ptr)
- : pointer(0)
- {
- this->operator=(ptr);
- }
- RefPtrImpl(const RefPtrImpl<T, 1, Destructor> & ptr)
- : pointer(0)
- {
- this->operator=(ptr);
- }
- RefPtrImpl(RefPtrImpl<T, 1, Destructor> && str)
- : pointer(0)
+ private:
+ T * pointer;
+ public:
+ RefPtrImpl()
+ {
+ pointer = 0;
+ }
+ RefPtrImpl(T * ptr)
+ : pointer(0)
+ {
+ this->operator=(ptr);
+ }
+ RefPtrImpl(const RefPtrImpl<T, 1, Destructor> & ptr)
+ : pointer(0)
+ {
+ this->operator=(ptr);
+ }
+ RefPtrImpl(RefPtrImpl<T, 1, Destructor> && str)
+ : pointer(0)
+ {
+ this->operator=(static_cast<RefPtrImpl<T, 1, Destructor> &&>(str));
+ }
+ template <typename U>
+ RefPtrImpl(const RefPtrImpl<U, 1, Destructor>& ptr,
+ typename EnableIf<IsConvertible<T*, U*>::Value, void>::type * = 0)
+ : pointer(0)
+ {
+ pointer = ptr.pointer;
+ if (ptr)
{
- this->operator=(static_cast<RefPtrImpl<T, 1, Destructor> &&>(str));
+ ptr->_refCount++;
}
- template <typename U>
- RefPtrImpl(const RefPtrImpl<U, 1, Destructor>& ptr,
- typename EnableIf<IsConvertible<T*, U*>::Value, void>::type * = 0)
- : pointer(0)
+ }
+
+ template <typename U>
+ typename EnableIf<IsConvertible<T*, U*>::value, RefPtrImpl<T, 1, Destructor>&>::type
+ operator=(const RefPtrImpl<U, 1, Destructor> & ptr)
+ {
+ Unreference();
+
+ pointer = ptr.pointer;
+ if (ptr)
{
- pointer = ptr.pointer;
- if (ptr)
- {
- ptr->_refCount++;
- }
+ ptr->_refCount++;
}
-
- template <typename U>
- typename EnableIf<IsConvertible<T*, U*>::value, RefPtrImpl<T, 1, Destructor>&>::type
- operator=(const RefPtrImpl<U, 1, Destructor> & ptr)
+ return *this;
+ }
+ RefPtrImpl<T, 1, Destructor>& operator=(T * ptr)
+ {
+ if (ptr != pointer)
{
Unreference();
- pointer = ptr.pointer;
+ pointer = ptr;
if (ptr)
{
ptr->_refCount++;
}
- return *this;
}
- RefPtrImpl<T, 1, Destructor>& operator=(T * ptr)
- {
- if (ptr != pointer)
- {
- Unreference();
-
- pointer = ptr;
- if (ptr)
- {
- ptr->_refCount++;
- }
- }
- return *this;
- }
- RefPtrImpl<T, 1, Destructor>& operator=(const RefPtrImpl<T, 1, Destructor> & ptr)
- {
- // Note: It is possible that the object this pointer references owns
- // (directly or indirectly) the storage for the argument `ptr`. If
- // that is the case and the `Unreference()` call below frees this
- // object, then the argument would become invalid.
- //
- // We copy the pointer value out of the argument first, in order
- // to protected against this case.
- T* ptrPointer = ptr.pointer;
- if (ptrPointer != pointer)
- {
- if (ptrPointer)
- ptrPointer->_refCount++;
- Unreference();
- pointer = ptrPointer;
- }
- return *this;
- }
- int GetHashCode()
- {
- return (int)(long long)(void*)pointer;
- }
- bool operator == (const T * ptr) const
- {
- return pointer == ptr;
- }
- bool operator != (const T * ptr) const
- {
- return pointer != ptr;
- }
- template<typename U>
- bool operator == (const RefPtr<U, Destructor> & ptr) const
- {
- return pointer == ptr.pointer;
- }
- template<typename U>
- bool operator != (const RefPtr<U, Destructor> & ptr) const
- {
- return pointer != ptr.pointer;
+ return *this;
+ }
+ RefPtrImpl<T, 1, Destructor>& operator=(const RefPtrImpl<T, 1, Destructor> & ptr)
+ {
+ // Note: It is possible that the object this pointer references owns
+ // (directly or indirectly) the storage for the argument `ptr`. If
+ // that is the case and the `Unreference()` call below frees this
+ // object, then the argument would become invalid.
+ //
+ // We copy the pointer value out of the argument first, in order
+ // to protected against this case.
+ T* ptrPointer = ptr.pointer;
+ if (ptrPointer != pointer)
+ {
+ if (ptrPointer)
+ ptrPointer->_refCount++;
+ Unreference();
+ pointer = ptrPointer;
}
- template<typename U>
- RefPtrImpl<U, 1, Destructor> As() const
+ return *this;
+ }
+ int GetHashCode()
+ {
+ return (int)(long long)(void*)pointer;
+ }
+ bool operator == (const T * ptr) const
+ {
+ return pointer == ptr;
+ }
+ bool operator != (const T * ptr) const
+ {
+ return pointer != ptr;
+ }
+ template<typename U>
+ bool operator == (const RefPtr<U, Destructor> & ptr) const
+ {
+ return pointer == ptr.pointer;
+ }
+ template<typename U>
+ bool operator != (const RefPtr<U, Destructor> & ptr) const
+ {
+ return pointer != ptr.pointer;
+ }
+ template<typename U>
+ RefPtrImpl<U, 1, Destructor> As() const
+ {
+ RefPtrImpl<U, 1, Destructor> result;
+ if (pointer)
{
- RefPtrImpl<U, 1, Destructor> result;
- if (pointer)
+ result.pointer = dynamic_cast<U*>(pointer);
+ if (result.pointer)
{
- result.pointer = dynamic_cast<U*>(pointer);
- if (result.pointer)
- {
- result.pointer->_refCount++;
- }
+ result.pointer->_refCount++;
}
- return result;
- }
- T* operator +(int offset) const
- {
- return pointer + offset;
}
- T& operator [](int idx) const
+ return result;
+ }
+ T* operator +(int offset) const
+ {
+ return pointer + offset;
+ }
+ T& operator [](int idx) const
+ {
+ return *(pointer + idx);
+ }
+ RefPtrImpl<T, 1, Destructor>& operator=(RefPtrImpl<T, 1, Destructor> && ptr)
+ {
+ if (ptr.pointer != pointer)
{
- return *(pointer + idx);
+ Unreference();
+ pointer = ptr.pointer;
+ ptr.pointer = nullptr;
}
- RefPtrImpl<T, 1, Destructor>& operator=(RefPtrImpl<T, 1, Destructor> && ptr)
+ return *this;
+ }
+ T* Release()
+ {
+ if (pointer)
{
- if (ptr.pointer != pointer)
- {
- Unreference();
- pointer = ptr.pointer;
- ptr.pointer = nullptr;
- }
- return *this;
+ pointer->_refCount--;
}
- T* Release()
+ auto rs = pointer;
+ pointer = 0;
+ return rs;
+ }
+ ~RefPtrImpl()
+ {
+ Unreference();
+ }
+
+ void Unreference()
+ {
+ if (pointer)
{
- if (pointer)
+ if (pointer->_refCount > 1)
{
pointer->_refCount--;
}
- auto rs = pointer;
- pointer = 0;
- return rs;
- }
- ~RefPtrImpl()
- {
- Unreference();
- }
-
- void Unreference()
- {
- if (pointer)
+ else
{
- if (pointer->_refCount > 1)
- {
- pointer->_refCount--;
- }
- else
- {
- Destructor destructor;
- destructor(pointer);
- }
+ Destructor destructor;
+ destructor(pointer);
}
}
- T & operator *() const
- {
- return *pointer;
- }
- T * operator->() const
- {
- return pointer;
- }
- T * Ptr() const
- {
- return pointer;
- }
- public:
- explicit operator bool() const
- {
- if (pointer)
- return true;
- else
- return false;
- }
- };
- }
+ }
+ T & operator *() const
+ {
+ return *pointer;
+ }
+ T * operator->() const
+ {
+ return pointer;
+ }
+ T * Ptr() const
+ {
+ return pointer;
+ }
+ public:
+ explicit operator bool() const
+ {
+ if (pointer)
+ return true;
+ else
+ return false;
+ }
+ };
}
#endif \ No newline at end of file