1// Copyright (c) 2012 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_MAC_SCOPED_IOOBJECT_H_
6#define BASE_MAC_SCOPED_IOOBJECT_H_
7
8#include <IOKit/IOKitLib.h>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12
13namespace base {
14namespace mac {
15
16// Just like ScopedCFTypeRef but for io_object_t and subclasses.
17template<typename IOT>
18class ScopedIOObject {
19 public:
20  typedef IOT element_type;
21
22  explicit ScopedIOObject(IOT object = IO_OBJECT_NULL)
23      : object_(object) {
24  }
25
26  ~ScopedIOObject() {
27    if (object_)
28      IOObjectRelease(object_);
29  }
30
31  void reset(IOT object = IO_OBJECT_NULL) {
32    if (object_)
33      IOObjectRelease(object_);
34    object_ = object;
35  }
36
37  bool operator==(IOT that) const {
38    return object_ == that;
39  }
40
41  bool operator!=(IOT that) const {
42    return object_ != that;
43  }
44
45  operator IOT() const {
46    return object_;
47  }
48
49  IOT get() const {
50    return object_;
51  }
52
53  void swap(ScopedIOObject& that) {
54    IOT temp = that.object_;
55    that.object_ = object_;
56    object_ = temp;
57  }
58
59  IOT release() WARN_UNUSED_RESULT {
60    IOT temp = object_;
61    object_ = IO_OBJECT_NULL;
62    return temp;
63  }
64
65 private:
66  IOT object_;
67
68  DISALLOW_COPY_AND_ASSIGN(ScopedIOObject);
69};
70
71}  // namespace mac
72}  // namespace base
73
74#endif  // BASE_MAC_SCOPED_IOOBJECT_H_
75