| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef BASE_MAC_SCOPED_IOOBJECT_H_ | 
 | #define BASE_MAC_SCOPED_IOOBJECT_H_ | 
 |  | 
 | #include <IOKit/IOKitLib.h> | 
 |  | 
 | #include "base/basictypes.h" | 
 | #include "base/compiler_specific.h" | 
 |  | 
 | namespace base { | 
 | namespace mac { | 
 |  | 
 | // Just like ScopedCFTypeRef but for io_object_t and subclasses. | 
 | template<typename IOT> | 
 | class ScopedIOObject { | 
 |  public: | 
 |   typedef IOT element_type; | 
 |  | 
 |   explicit ScopedIOObject(IOT object = IO_OBJECT_NULL) | 
 |       : object_(object) { | 
 |   } | 
 |  | 
 |   ~ScopedIOObject() { | 
 |     if (object_) | 
 |       IOObjectRelease(object_); | 
 |   } | 
 |  | 
 |   void reset(IOT object = IO_OBJECT_NULL) { | 
 |     if (object_) | 
 |       IOObjectRelease(object_); | 
 |     object_ = object; | 
 |   } | 
 |  | 
 |   bool operator==(IOT that) const { | 
 |     return object_ == that; | 
 |   } | 
 |  | 
 |   bool operator!=(IOT that) const { | 
 |     return object_ != that; | 
 |   } | 
 |  | 
 |   operator IOT() const { | 
 |     return object_; | 
 |   } | 
 |  | 
 |   IOT get() const { | 
 |     return object_; | 
 |   } | 
 |  | 
 |   void swap(ScopedIOObject& that) { | 
 |     IOT temp = that.object_; | 
 |     that.object_ = object_; | 
 |     object_ = temp; | 
 |   } | 
 |  | 
 |   IOT release() WARN_UNUSED_RESULT { | 
 |     IOT temp = object_; | 
 |     object_ = IO_OBJECT_NULL; | 
 |     return temp; | 
 |   } | 
 |  | 
 |  private: | 
 |   IOT object_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ScopedIOObject); | 
 | }; | 
 |  | 
 | }  // namespace mac | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_MAC_SCOPED_IOOBJECT_H_ |