1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 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_LOCALALLOC_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_SCOPED_LOCALALLOC_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <utility> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/win/windows_types.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker namespace win { 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker // unique_ptr deleter for LocalAlloc memory. 17*6777b538SAndroid Build Coastguard Worker struct LocalAllocDeleter { operatorLocalAllocDeleter18*6777b538SAndroid Build Coastguard Worker void operator()(void* ptr) const { ::LocalFree(ptr); } 19*6777b538SAndroid Build Coastguard Worker }; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker template <typename T> 22*6777b538SAndroid Build Coastguard Worker using ScopedLocalAllocTyped = std::unique_ptr<T, LocalAllocDeleter>; 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker using ScopedLocalAlloc = ScopedLocalAllocTyped<void>; 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // Make a typed ScopedLocalAlloc class and clear the original pointer. 27*6777b538SAndroid Build Coastguard Worker template <typename T> TakeLocalAlloc(T * & ptr)28*6777b538SAndroid Build Coastguard WorkerScopedLocalAllocTyped<T> TakeLocalAlloc(T*& ptr) { 29*6777b538SAndroid Build Coastguard Worker return ScopedLocalAllocTyped<T>(std::exchange(ptr, nullptr)); 30*6777b538SAndroid Build Coastguard Worker } 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker } // namespace win 33*6777b538SAndroid Build Coastguard Worker } // namespace base 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_SCOPED_LOCALALLOC_H_ 36