1// Copyright (c) 2013 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 PPAPI_CPP_EXTENSIONS_OPTIONAL_H_
6#define PPAPI_CPP_EXTENSIONS_OPTIONAL_H_
7
8namespace pp {
9namespace ext {
10
11template <class T>
12class Optional {
13 public:
14  Optional() : value_(NULL) {
15  }
16  // Takes ownership of |value|.
17  explicit Optional(T* value) : value_(value) {
18  }
19  Optional(const T& value) : value_(new T(value)) {
20  }
21  Optional(const Optional<T>& other)
22      : value_(other.value_ ? new T(*other.value_) : NULL) {
23  }
24
25  ~Optional() {
26    Reset();
27  }
28
29  Optional<T>& operator=(const T& other) {
30    if (value_ == &other)
31      return *this;
32
33    Reset();
34    value_ = new T(other);
35
36    return *this;
37  }
38
39  Optional<T>& operator=(const Optional<T>& other) {
40    if (value_ == other.value_)
41      return *this;
42
43    Reset();
44    if (other.value_)
45      value_ = new T(*other.value_);
46
47    return *this;
48  }
49
50  bool IsSet() const {
51    return !!value_;
52  }
53
54  T* Get() const {
55    return value_;
56  }
57
58  // Should only be used when IsSet() is true.
59  T& operator*() const {
60    return *value_;
61  }
62
63  // Should only be used when IsSet() is true.
64  T* operator->() const {
65    PP_DCHECK(value_);
66    return value_;
67  }
68
69  // Takes ownership of |value|.
70  void Set(T* value) {
71    if (value == value_)
72      return;
73
74    Reset();
75    *value_ = value;
76  }
77
78  void Reset() {
79    T* value = value_;
80    value_ = NULL;
81    delete value;
82  }
83
84  void Swap(Optional<T>* other) {
85    T* temp = value_;
86    value_ = other->value_;
87    other->value_ = temp;
88  }
89
90 private:
91  T* value_;
92};
93
94}  // namespace ext
95}  // namespace pp
96
97#endif  // PPAPI_CPP_EXTENSIONS_OPTIONAL_H_
98