brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 48a5ef3 Raw
89 lines · c
1#ifndef _OS_SMART_POINTER_H2#define _OS_SMART_POINTER_H3 4#include "os_object_base.h"5 6namespace os {7 8template<class T>9struct smart_ptr {10  smart_ptr() : pointer(nullptr) {}11 12  explicit smart_ptr(T *&p) : pointer(p) {13    if (pointer) {14      _retain(pointer);15    }16  }17 18  smart_ptr(smart_ptr const &rhs) : pointer(rhs.pointer) {19    if (pointer) {20      _retain(pointer);21    }22  }23 24  smart_ptr & operator=(T *&rhs) {25    smart_ptr(rhs).swap(*this);26    return *this;27  }28 29  smart_ptr & operator=(smart_ptr &rhs) {30    smart_ptr(rhs).swap(*this);31    return *this;32  }33 34  ~smart_ptr() {35    if (pointer) {36      _release(pointer);37    }38  }39 40  void reset() {41    smart_ptr().swap(*this);42  }43 44  T *get() const {45    return pointer;46  }47 48  T ** get_for_out_param() {49    reset();50    return &pointer;51  }52 53  T * operator->() const {54    return pointer;55  }56 57  explicit58  operator bool() const {59    return pointer != nullptr;60  }61 62  inline void63  swap(smart_ptr &p) {64    T *temp = pointer;65    pointer = p.pointer;66    p.pointer = temp;67  }68 69  static inline void70  _retain(T *obj) {71    obj->retain();72  }73 74  static inline void75  _release(T *obj) {76    obj->release();77  }78 79  static inline T *80  _alloc() {81    return new T;82  }83 84  T *pointer;85};86} // namespace os87 88#endif /* _OS_SMART_POINTER_H */89