diff options
| author | George Karpenkov <ekarpenkov@apple.com> | 2019-01-18 03:12:35 +0000 |
|---|---|---|
| committer | George Karpenkov <ekarpenkov@apple.com> | 2019-01-18 03:12:35 +0000 |
| commit | a0425f3a2fe5f00f82e8792d63eb1274839d7a78 (patch) | |
| tree | 6d03b4a1b9fa286ecdcceeca76c34c941cbb0b5f /clang/test/Analysis/os_smart_ptr.h | |
| parent | c6795e07f03ddc8a9ab3e7dd86da713a7a8003c5 (diff) | |
| download | bcm5719-llvm-a0425f3a2fe5f00f82e8792d63eb1274839d7a78.tar.gz bcm5719-llvm-a0425f3a2fe5f00f82e8792d63eb1274839d7a78.zip | |
[analyzer] [RetainCountChecker] Smart pointer support.
rdar://47323216
Differential Revision: https://reviews.llvm.org/D56817
llvm-svn: 351508
Diffstat (limited to 'clang/test/Analysis/os_smart_ptr.h')
| -rw-r--r-- | clang/test/Analysis/os_smart_ptr.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/clang/test/Analysis/os_smart_ptr.h b/clang/test/Analysis/os_smart_ptr.h new file mode 100644 index 00000000000..8faf294f751 --- /dev/null +++ b/clang/test/Analysis/os_smart_ptr.h @@ -0,0 +1,89 @@ +#ifndef _OS_SMART_POINTER_H +#define _OS_SMART_POINTER_H + +#include "os_object_base.h" + +namespace os { + +template<class T> +struct smart_ptr { + smart_ptr() : pointer(nullptr) {} + + explicit smart_ptr(T *&p) : pointer(p) { + if (pointer) { + _retain(pointer); + } + } + + smart_ptr(smart_ptr const &rhs) : pointer(rhs.pointer) { + if (pointer) { + _retain(pointer); + } + } + + smart_ptr & operator=(T *&rhs) { + smart_ptr(rhs).swap(*this); + return *this; + } + + smart_ptr & operator=(smart_ptr &rhs) { + smart_ptr(rhs).swap(*this); + return *this; + } + + ~smart_ptr() { + if (pointer) { + _release(pointer); + } + } + + void reset() { + smart_ptr().swap(*this); + } + + T *get() const { + return pointer; + } + + T ** get_for_out_param() { + reset(); + return &pointer; + } + + T * operator->() const { + OSPTR_LOG("Dereference smart_ptr with %p\n", pointer); + return pointer; + } + + explicit + operator bool() const { + return pointer != nullptr; + } + + inline void + swap(smart_ptr &p) { + T *temp = pointer; + pointer = p.pointer; + p.pointer = temp; + } + + static inline void + _retain(T *obj) { + obj->retain(); + } + + static inline void + _release(T *obj) { + obj->release(); + } + + static inline T * + _alloc() { + return new T; + } + + T *pointer; +}; +} + +#endif /* _OS_SMART_POINTER_H */ |

