1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_SCOPED_HGLOBAL_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_SCOPED_HGLOBAL_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <windows.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include <utility> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace base { 15*6777b538SAndroid Build Coastguard Worker namespace win { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // Like ScopedHandle except for HGLOBAL. 18*6777b538SAndroid Build Coastguard Worker template <class Ptr> 19*6777b538SAndroid Build Coastguard Worker class ScopedHGlobal { 20*6777b538SAndroid Build Coastguard Worker public: ScopedHGlobal(HGLOBAL glob)21*6777b538SAndroid Build Coastguard Worker explicit ScopedHGlobal(HGLOBAL glob) 22*6777b538SAndroid Build Coastguard Worker : glob_(glob), data_(static_cast<Ptr>(GlobalLock(glob_))) {} 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker ScopedHGlobal(const ScopedHGlobal&) = delete; 25*6777b538SAndroid Build Coastguard Worker ScopedHGlobal& operator=(const ScopedHGlobal&) = delete; 26*6777b538SAndroid Build Coastguard Worker ~ScopedHGlobal()27*6777b538SAndroid Build Coastguard Worker ~ScopedHGlobal() { GlobalUnlock(glob_); } 28*6777b538SAndroid Build Coastguard Worker data()29*6777b538SAndroid Build Coastguard Worker Ptr data() { return data_; } size()30*6777b538SAndroid Build Coastguard Worker size_t size() const { return GlobalSize(glob_); } 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker Ptr operator->() const { 33*6777b538SAndroid Build Coastguard Worker assert(data_ != 0); 34*6777b538SAndroid Build Coastguard Worker return data_; 35*6777b538SAndroid Build Coastguard Worker } 36*6777b538SAndroid Build Coastguard Worker release()37*6777b538SAndroid Build Coastguard Worker Ptr release() { return std::exchange(data_, nullptr); } 38*6777b538SAndroid Build Coastguard Worker begin()39*6777b538SAndroid Build Coastguard Worker Ptr begin() { return data(); } end()40*6777b538SAndroid Build Coastguard Worker Ptr end() { return data() + size(); } 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker private: 43*6777b538SAndroid Build Coastguard Worker HGLOBAL glob_; 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker Ptr data_; 46*6777b538SAndroid Build Coastguard Worker }; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker } // namespace win 49*6777b538SAndroid Build Coastguard Worker } // namespace base 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_SCOPED_HGLOBAL_H_ 52