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