// 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_