Changeset 25934 in webkit for trunk/JavaScriptCore/wtf/OwnPtr.h
- Timestamp:
- Oct 2, 2007, 1:49:13 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/wtf/OwnPtr.h
r17437 r25934 1 1 // -*- mode: c++; c-basic-offset: 4 -*- 2 2 /* 3 * Copyright (C) 2006 Apple Computer, Inc.3 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 27 27 #include <wtf/Noncopyable.h> 28 28 29 #if PLATFORM(WIN) 30 31 typedef struct HBITMAP__* HBITMAP; 32 typedef struct HBRUSH__* HBRUSH; 33 typedef struct HFONT__* HFONT; 34 typedef struct HPALETTE__* HPALETTE; 35 typedef struct HPEN__* HPEN; 36 typedef struct HRGN__* HRGN; 37 38 #endif 39 29 40 namespace WTF { 41 42 // Unlike most of our smart pointers, OwnPtr can take either the pointer type or the pointed-to type. 43 44 // FIXME: Share a single RemovePointer class template with RetainPtr. 45 template <typename T> struct OwnPtrRemovePointer { typedef T type; }; 46 template <typename T> struct OwnPtrRemovePointer<T*> { typedef T type; }; 47 48 template <typename T> inline void deleteOwnedPtr(T* ptr) 49 { 50 typedef char known[sizeof(T) ? 1 : -1]; 51 if (sizeof(known)) 52 delete ptr; 53 } 54 55 #if PLATFORM(WIN) 56 void deleteOwnedPtr(HBITMAP); 57 void deleteOwnedPtr(HBRUSH); 58 void deleteOwnedPtr(HFONT); 59 void deleteOwnedPtr(HPALETTE); 60 void deleteOwnedPtr(HPEN); 61 void deleteOwnedPtr(HRGN); 62 #endif 30 63 31 64 template <typename T> class OwnPtr : Noncopyable { 32 65 public: 33 explicit OwnPtr(T* ptr = 0) : m_ptr(ptr) { }34 ~OwnPtr() { safeDelete(); }66 typedef typename OwnPtrRemovePointer<T>::type ValueType; 67 typedef ValueType* PtrType; 35 68 36 T* get() const { return m_ptr;}37 T* release() { T* ptr = m_ptr; m_ptr = 0; return ptr; }69 explicit OwnPtr(PtrType ptr = 0) : m_ptr(ptr) { } 70 ~OwnPtr() { deleteOwnedPtr(m_ptr); } 38 71 39 void set(T* ptr) { ASSERT(!ptr || m_ptr != ptr); safeDelete(); m_ptr =ptr; }40 void clear() { safeDelete(); m_ptr = 0; }72 PtrType get() const { return m_ptr; } 73 PtrType release() { PtrType ptr = m_ptr; m_ptr = 0; return ptr; } 41 74 42 T& operator*() const { ASSERT(m_ptr); return *m_ptr; } 43 T* operator->() const { ASSERT(m_ptr); return m_ptr; } 75 void set(PtrType ptr) { ASSERT(!ptr || m_ptr != ptr); deleteOwnedPtr(m_ptr); m_ptr = ptr; } 76 void clear() { deleteOwnedPtr(m_ptr); m_ptr = 0; } 77 78 ValueType& operator*() const { ASSERT(m_ptr); return *m_ptr; } 79 PtrType operator->() const { ASSERT(m_ptr); return m_ptr; } 44 80 45 81 bool operator!() const { return !m_ptr; } 46 82 47 83 // This conversion operator allows implicit conversion to bool but not to other integer types. 48 typedef T*(OwnPtr::*UnspecifiedBoolType)() const;84 typedef PtrType (OwnPtr::*UnspecifiedBoolType)() const; 49 85 operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtr::get : 0; } 50 86 … … 52 88 53 89 private: 54 void safeDelete() { typedef char known[sizeof(T) ? 1 : -1]; if (sizeof(known)) delete m_ptr; } 55 56 T* m_ptr; 90 PtrType m_ptr; 57 91 }; 58 92 59 93 template <typename T> inline void swap(OwnPtr<T>& a, OwnPtr<T>& b) { a.swap(b); } 60 94 61 template <typename T> inline T*getPtr(const OwnPtr<T>& p)95 template <typename T> inline typename OwnPtr<T>::PtrType getPtr(const OwnPtr<T>& p) 62 96 { 63 97 return p.get();
Note:
See TracChangeset
for help on using the changeset viewer.