Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_ | 5 #ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_ |
| 6 #define BASE_WIN_SCOPED_GDI_OBJECT_H_ | 6 #define BASE_WIN_SCOPED_GDI_OBJECT_H_ |
| 7 | 7 |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/move.h" | |
| 12 | 13 |
| 13 namespace base { | 14 namespace base { |
| 14 namespace win { | 15 namespace win { |
| 15 | 16 |
| 16 // Like ScopedHandle but for GDI objects. | 17 // Like ScopedHandle but for GDI objects. |
| 17 template<class T> | 18 template<class T> |
| 18 class ScopedGDIObject { | 19 class ScopedGDIObject { |
|
grt (UTC plus 2)
2015/11/06 19:49:20
can you implement this in terms of ScopedGeneric?
anpol
2015/11/06 20:28:16
Looking at ScopedGeneric briefly:
* ScopedGDIObje
| |
| 20 MOVE_ONLY_TYPE_WITH_MOVE_CONSTRUCTOR_FOR_CPP_03(ScopedGDIObject) | |
| 21 | |
| 19 public: | 22 public: |
| 20 ScopedGDIObject() : object_(NULL) {} | 23 ScopedGDIObject() : object_(nullptr) {} |
| 24 ScopedGDIObject(decltype(nullptr)) : object_(nullptr) {} | |
| 25 | |
| 26 // Constructor that takes ownership of an object. | |
| 21 explicit ScopedGDIObject(T object) : object_(object) {} | 27 explicit ScopedGDIObject(T object) : object_(object) {} |
| 22 | 28 |
| 29 // Constructor that transfers ownership from another ScopedGDIObject. | |
| 30 ScopedGDIObject(ScopedGDIObject&& other) : object_(nullptr) { | |
| 31 Set(other.release()); | |
| 32 } | |
| 33 | |
| 23 ~ScopedGDIObject() { | 34 ~ScopedGDIObject() { |
| 24 Close(); | 35 Close(); |
| 25 } | 36 } |
| 26 | 37 |
| 27 T Get() { | 38 T Get() { |
| 28 return object_; | 39 return object_; |
| 29 } | 40 } |
| 30 | 41 |
| 31 void Set(T object) { | 42 void Set(T object) { |
| 32 if (object_ && object != object_) | 43 if (object_ && object != object_) |
| 33 Close(); | 44 Close(); |
| 34 object_ = object; | 45 object_ = object; |
| 35 } | 46 } |
| 36 | 47 |
| 48 // operator= that deletes the currently owned object, if any. | |
| 49 ScopedGDIObject& operator=(decltype(nullptr)) { | |
| 50 Set(nullptr); | |
| 51 return *this; | |
| 52 } | |
| 53 | |
| 54 // operator= that takes ownership of an object. | |
| 37 ScopedGDIObject& operator=(T object) { | 55 ScopedGDIObject& operator=(T object) { |
| 38 Set(object); | 56 Set(object); |
| 39 return *this; | 57 return *this; |
| 40 } | 58 } |
| 41 | 59 |
| 60 // operator= that transfers ownership from another ScopedGDIObject. | |
| 61 ScopedGDIObject& operator=(ScopedGDIObject&& rhs) { | |
| 62 Set(rhs.release()); | |
| 63 return *this; | |
| 64 } | |
| 65 | |
| 42 T release() { | 66 T release() { |
| 43 T object = object_; | 67 T object = object_; |
| 44 object_ = NULL; | 68 object_ = nullptr; |
| 45 return object; | 69 return object; |
| 46 } | 70 } |
| 47 | 71 |
| 48 operator T() { return object_; } | 72 operator T() { return object_; } |
| 49 | 73 |
| 50 private: | 74 private: |
| 51 void Close() { | 75 void Close() { |
| 52 if (object_) | 76 if (object_) |
| 53 DeleteObject(object_); | 77 DeleteObject(object_); |
| 54 } | 78 } |
| 55 | 79 |
| 56 T object_; | 80 T object_; |
| 57 DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject); | |
| 58 }; | 81 }; |
| 59 | 82 |
| 60 // An explicit specialization for HICON because we have to call DestroyIcon() | 83 // An explicit specialization for HICON because we have to call DestroyIcon() |
| 61 // instead of DeleteObject() for HICON. | 84 // instead of DeleteObject() for HICON. |
| 62 template<> | 85 template<> |
| 63 void inline ScopedGDIObject<HICON>::Close() { | 86 void inline ScopedGDIObject<HICON>::Close() { |
| 64 if (object_) | 87 if (object_) |
| 65 DestroyIcon(object_); | 88 DestroyIcon(object_); |
| 66 } | 89 } |
| 67 | 90 |
| 68 // Typedefs for some common use cases. | 91 // Typedefs for some common use cases. |
| 69 typedef ScopedGDIObject<HBITMAP> ScopedBitmap; | 92 typedef ScopedGDIObject<HBITMAP> ScopedBitmap; |
| 70 typedef ScopedGDIObject<HRGN> ScopedRegion; | 93 typedef ScopedGDIObject<HRGN> ScopedRegion; |
| 71 typedef ScopedGDIObject<HFONT> ScopedHFONT; | 94 typedef ScopedGDIObject<HFONT> ScopedHFONT; |
| 72 typedef ScopedGDIObject<HICON> ScopedHICON; | 95 typedef ScopedGDIObject<HICON> ScopedHICON; |
| 73 | 96 |
| 74 } // namespace win | 97 } // namespace win |
| 75 } // namespace base | 98 } // namespace base |
| 76 | 99 |
| 77 #endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ | 100 #endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ |
| OLD | NEW |