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 |