xref: /aosp_15_r20/external/cronet/base/win/scoped_localalloc.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker ScopedLocalAllocTyped<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