1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_WIN_SCOPED_CO_MEM_H_
6#define BASE_WIN_SCOPED_CO_MEM_H_
7
8#include <objbase.h>
9
10#include "base/basictypes.h"
11#include "base/logging.h"
12
13namespace base {
14namespace win {
15
16// Simple scoped memory releaser class for COM allocated memory.
17// Example:
18//   base::win::ScopedCoMem<ITEMIDLIST> file_item;
19//   SHGetSomeInfo(&file_item, ...);
20//   ...
21//   return;  <-- memory released
22template<typename T>
23class ScopedCoMem {
24 public:
25  ScopedCoMem() : mem_ptr_(NULL) {}
26  ~ScopedCoMem() {
27    Reset(NULL);
28  }
29
30  T** operator&() {  // NOLINT
31    DCHECK(mem_ptr_ == NULL);  // To catch memory leaks.
32    return &mem_ptr_;
33  }
34
35  operator T*() {
36    return mem_ptr_;
37  }
38
39  T* operator->() {
40    DCHECK(mem_ptr_ != NULL);
41    return mem_ptr_;
42  }
43
44  const T* operator->() const {
45    DCHECK(mem_ptr_ != NULL);
46    return mem_ptr_;
47  }
48
49  void Reset(T* ptr) {
50    if (mem_ptr_)
51      CoTaskMemFree(mem_ptr_);
52    mem_ptr_ = ptr;
53  }
54
55  T* get() const {
56    return mem_ptr_;
57  }
58
59 private:
60  T* mem_ptr_;
61
62  DISALLOW_COPY_AND_ASSIGN(ScopedCoMem);
63};
64
65}  // namespace win
66}  // namespace base
67
68#endif  // BASE_WIN_SCOPED_CO_MEM_H_
69