Mercurial > hg > CbC > CbC_llvm
view clang/test/Analysis/os_smart_ptr.h @ 222:81f6424ef0e3 llvm-original
LLVM original branch
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 18 Jul 2021 22:10:01 +0900 |
parents | 1d019706d866 |
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 */