1 // 2 // Copyright (c) ZeroC, Inc. All rights reserved. 3 // 4 5 #ifndef ICE_UNIQUE_REF_H 6 #define ICE_UNIQUE_REF_H 7 8 #ifdef __APPLE__ 9 10 #include <CoreFoundation/CoreFoundation.h> 11 12 namespace IceInternal 13 { 14 15 // 16 // UniqueRef helper class for CoreFoundation classes, comparable to std::unique_ptr 17 // 18 template<typename R> 19 class UniqueRef 20 { 21 public: 22 23 explicit UniqueRef(R ref = 0) : _ref(ref)24 _ref(ref) 25 { 26 } 27 ~UniqueRef()28 ~UniqueRef() 29 { 30 if(_ref != 0) 31 { 32 CFRelease(_ref); 33 } 34 } 35 release()36 R release() 37 { 38 R r = _ref; 39 _ref = 0; 40 return r; 41 } 42 43 void reset(R ref = 0) 44 { 45 // 46 // Support "self-reset" for CF objects. This is useful if CF allocation methods return 47 // the same object with an increased reference count. 48 // 49 //assert(ref == 0 || ref != _ref); 50 51 if(_ref != 0) 52 { 53 CFRelease(_ref); 54 } 55 _ref = ref; 56 } 57 retain(R ref)58 void retain(R ref) 59 { 60 reset(ref ? (R)CFRetain(ref) : ref); 61 } 62 get()63 R& get() 64 { 65 return _ref; 66 } 67 get()68 R get() const 69 { 70 return _ref; 71 } 72 73 operator bool() const 74 { 75 return _ref != 0; 76 } 77 swap(UniqueRef & a)78 void swap(UniqueRef& a) 79 { 80 R tmp = a._ref; 81 a._ref = _ref; 82 _ref = tmp; 83 } 84 85 private: 86 87 UniqueRef(UniqueRef&); 88 UniqueRef& operator=(UniqueRef&); 89 90 R _ref; 91 }; 92 93 } 94 95 #endif 96 97 #endif 98