Mercurial > hg > CbC > CbC_llvm
view clang/test/Analysis/os_smart_ptr.h @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 (2020-02-13) |
parents | |
children |
line wrap: on
line source
#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 { 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; }; } // namespace os #endif /* _OS_SMART_POINTER_H */