Pepper_31_C++_interfaces
optional.h
Go to the documentation of this file.
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 
8 namespace pp {
9 namespace ext {
10 
11 template <class T>
12 class 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 
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 
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_
void Set(T *value)
Definition: optional.h:70
#define PP_DCHECK(a)
Definition: logging.h:16
T & operator*() const
Definition: optional.h:59
bool IsSet() const
Definition: optional.h:50
void Swap(Optional< T > *other)
Definition: optional.h:84
Optional(const Optional< T > &other)
Definition: optional.h:21
T * operator->() const
Definition: optional.h:64
Optional(T *value)
Definition: optional.h:17
Optional(const T &value)
Definition: optional.h:19
Optional< T > & operator=(const T &other)
Definition: optional.h:29
T * Get() const
Definition: optional.h:54
Optional< T > & operator=(const Optional< T > &other)
Definition: optional.h:39