1 // Copyright 2014 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 MOJO_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_ 6 #define MOJO_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_ 7 8 #include "base/compiler_specific.h" 9 #include "base/move.h" 10 #include "mojo/embedder/platform_handle.h" 11 #include "mojo/system/system_impl_export.h" 12 13 namespace mojo { 14 namespace embedder { 15 16 class MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle { MOVE_ONLY_TYPE_FOR_CPP_03(ScopedPlatformHandle,RValue)17 MOVE_ONLY_TYPE_FOR_CPP_03(ScopedPlatformHandle, RValue) 18 19 public: 20 ScopedPlatformHandle() {} ScopedPlatformHandle(PlatformHandle handle)21 explicit ScopedPlatformHandle(PlatformHandle handle) : handle_(handle) {} ~ScopedPlatformHandle()22 ~ScopedPlatformHandle() { handle_.CloseIfNecessary(); } 23 24 // Move-only constructor and operator=. ScopedPlatformHandle(RValue other)25 ScopedPlatformHandle(RValue other) : handle_(other.object->release()) {} 26 ScopedPlatformHandle& operator=(RValue other) { 27 handle_ = other.object->release(); 28 return *this; 29 } 30 get()31 const PlatformHandle& get() const { return handle_; } 32 swap(ScopedPlatformHandle & other)33 void swap(ScopedPlatformHandle& other) { 34 PlatformHandle temp = handle_; 35 handle_ = other.handle_; 36 other.handle_ = temp; 37 } 38 release()39 PlatformHandle release() WARN_UNUSED_RESULT { 40 PlatformHandle rv = handle_; 41 handle_ = PlatformHandle(); 42 return rv; 43 } 44 45 void reset(PlatformHandle handle = PlatformHandle()) { 46 handle_.CloseIfNecessary(); 47 handle_ = handle; 48 } 49 is_valid()50 bool is_valid() const { 51 return handle_.is_valid(); 52 } 53 54 private: 55 PlatformHandle handle_; 56 }; 57 58 } // namespace embedder 59 } // namespace mojo 60 61 #endif // MOJO_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_ 62