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 { |
| 20 MOVE_ONLY_TYPE_WITH_MOVE_CONSTRUCTOR_FOR_CPP_03(ScopedGDIObject) | |
| 21 | |
| 19 public: | 22 public: |
| 23 // Constructor that defaults to initializing with NULL. | |
| 20 ScopedGDIObject() : object_(NULL) {} | 24 ScopedGDIObject() : object_(NULL) {} |
| 25 | |
| 26 // Constructor that takes ownership of an object. | |
|
sky
2015/11/03 17:23:15
This comment is useful as it clearly documents own
| |
| 21 explicit ScopedGDIObject(T object) : object_(object) {} | 27 explicit ScopedGDIObject(T object) : object_(object) {} |
| 22 | 28 |
| 29 // Constructor that allows construction from an rvalue. | |
| 30 ScopedGDIObject(ScopedGDIObject&& other) : object_(NULL) { | |
|
sky
2015/11/03 17:23:14
If you can, make these 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 takes ownership of an object. | |
| 37 ScopedGDIObject& operator=(T object) { | 49 ScopedGDIObject& operator=(T object) { |
| 38 Set(object); | 50 Set(object); |
| 39 return *this; | 51 return *this; |
| 40 } | 52 } |
| 41 | 53 |
| 54 // operator= that allows assignment from an rvalue. | |
| 55 ScopedGDIObject& operator=(ScopedGDIObject&& rhs) { | |
| 56 Set(rhs.release()); | |
| 57 return *this; | |
| 58 } | |
| 59 | |
| 42 T release() { | 60 T release() { |
| 43 T object = object_; | 61 T object = object_; |
| 44 object_ = NULL; | 62 object_ = NULL; |
| 45 return object; | 63 return object; |
| 46 } | 64 } |
| 47 | 65 |
| 48 operator T() { return object_; } | 66 operator T() { return object_; } |
| 49 | 67 |
| 50 private: | 68 private: |
| 51 void Close() { | 69 void Close() { |
| 52 if (object_) | 70 if (object_) |
| 53 DeleteObject(object_); | 71 DeleteObject(object_); |
| 54 } | 72 } |
| 55 | 73 |
| 56 T object_; | 74 T object_; |
| 57 DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject); | |
| 58 }; | 75 }; |
| 59 | 76 |
| 60 // An explicit specialization for HICON because we have to call DestroyIcon() | 77 // An explicit specialization for HICON because we have to call DestroyIcon() |
| 61 // instead of DeleteObject() for HICON. | 78 // instead of DeleteObject() for HICON. |
| 62 template<> | 79 template<> |
| 63 void inline ScopedGDIObject<HICON>::Close() { | 80 void inline ScopedGDIObject<HICON>::Close() { |
| 64 if (object_) | 81 if (object_) |
| 65 DestroyIcon(object_); | 82 DestroyIcon(object_); |
| 66 } | 83 } |
| 67 | 84 |
| 68 // Typedefs for some common use cases. | 85 // Typedefs for some common use cases. |
| 69 typedef ScopedGDIObject<HBITMAP> ScopedBitmap; | 86 typedef ScopedGDIObject<HBITMAP> ScopedBitmap; |
| 70 typedef ScopedGDIObject<HRGN> ScopedRegion; | 87 typedef ScopedGDIObject<HRGN> ScopedRegion; |
| 71 typedef ScopedGDIObject<HFONT> ScopedHFONT; | 88 typedef ScopedGDIObject<HFONT> ScopedHFONT; |
| 72 typedef ScopedGDIObject<HICON> ScopedHICON; | 89 typedef ScopedGDIObject<HICON> ScopedHICON; |
| 73 | 90 |
| 74 } // namespace win | 91 } // namespace win |
| 75 } // namespace base | 92 } // namespace base |
| 76 | 93 |
| 77 #endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ | 94 #endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ |
| OLD | NEW |