Home | History | Annotate | Download | only in extensions
      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 
     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