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
13namespace mojo {
14namespace embedder {
15
16class MOJO_SYSTEM_IMPL_EXPORT ScopedPlatformHandle {
17  MOVE_ONLY_TYPE_FOR_CPP_03(ScopedPlatformHandle, RValue)
18
19 public:
20  ScopedPlatformHandle() {}
21  explicit ScopedPlatformHandle(PlatformHandle handle) : handle_(handle) {}
22  ~ScopedPlatformHandle() { handle_.CloseIfNecessary(); }
23
24  // Move-only constructor and operator=.
25  ScopedPlatformHandle(RValue other) : handle_(other.object->release()) {}
26  ScopedPlatformHandle& operator=(RValue other) {
27    handle_ = other.object->release();
28    return *this;
29  }
30
31  const PlatformHandle& get() const { return handle_; }
32
33  void swap(ScopedPlatformHandle& other) {
34    PlatformHandle temp = handle_;
35    handle_ = other.handle_;
36    other.handle_ = temp;
37  }
38
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
50  bool is_valid() const { return handle_.is_valid(); }
51
52 private:
53  PlatformHandle handle_;
54};
55
56}  // namespace embedder
57}  // namespace mojo
58
59#endif  // MOJO_EMBEDDER_SCOPED_PLATFORM_HANDLE_H_
60