1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker // Optional.h: 7*8975f5c5SAndroid Build Coastguard Worker // Represents a type that may be invalid, similar to std::optional. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_OPTIONAL_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define COMMON_OPTIONAL_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include <utility> 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker template <class T> 16*8975f5c5SAndroid Build Coastguard Worker struct Optional 17*8975f5c5SAndroid Build Coastguard Worker { OptionalOptional18*8975f5c5SAndroid Build Coastguard Worker Optional() : mValid(false), mValue(T()) {} 19*8975f5c5SAndroid Build Coastguard Worker OptionalOptional20*8975f5c5SAndroid Build Coastguard Worker Optional(const T &valueIn) : mValid(true), mValue(valueIn) {} 21*8975f5c5SAndroid Build Coastguard Worker OptionalOptional22*8975f5c5SAndroid Build Coastguard Worker Optional(const Optional &other) : mValid(other.mValid), mValue(other.mValue) {} 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker Optional &operator=(const Optional &other) 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker this->mValid = other.mValid; 27*8975f5c5SAndroid Build Coastguard Worker this->mValue = other.mValue; 28*8975f5c5SAndroid Build Coastguard Worker return *this; 29*8975f5c5SAndroid Build Coastguard Worker } 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker Optional &operator=(const T &value) 32*8975f5c5SAndroid Build Coastguard Worker { 33*8975f5c5SAndroid Build Coastguard Worker mValue = value; 34*8975f5c5SAndroid Build Coastguard Worker mValid = true; 35*8975f5c5SAndroid Build Coastguard Worker return *this; 36*8975f5c5SAndroid Build Coastguard Worker } 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard Worker Optional &operator=(T &&value) 39*8975f5c5SAndroid Build Coastguard Worker { 40*8975f5c5SAndroid Build Coastguard Worker mValue = std::move(value); 41*8975f5c5SAndroid Build Coastguard Worker mValid = true; 42*8975f5c5SAndroid Build Coastguard Worker return *this; 43*8975f5c5SAndroid Build Coastguard Worker } 44*8975f5c5SAndroid Build Coastguard Worker resetOptional45*8975f5c5SAndroid Build Coastguard Worker void reset() { mValid = false; } releaseOptional46*8975f5c5SAndroid Build Coastguard Worker T &&release() 47*8975f5c5SAndroid Build Coastguard Worker { 48*8975f5c5SAndroid Build Coastguard Worker mValid = false; 49*8975f5c5SAndroid Build Coastguard Worker return std::move(mValue); 50*8975f5c5SAndroid Build Coastguard Worker } 51*8975f5c5SAndroid Build Coastguard Worker InvalidOptional52*8975f5c5SAndroid Build Coastguard Worker static Optional Invalid() { return Optional(); } 53*8975f5c5SAndroid Build Coastguard Worker validOptional54*8975f5c5SAndroid Build Coastguard Worker bool valid() const { return mValid; } valueOptional55*8975f5c5SAndroid Build Coastguard Worker T &value() { return mValue; } valueOptional56*8975f5c5SAndroid Build Coastguard Worker const T &value() const { return mValue; } valueOrOptional57*8975f5c5SAndroid Build Coastguard Worker const T &valueOr(const T &defaultValue) const { return mValid ? mValue : defaultValue; } 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker bool operator==(const Optional &other) const 60*8975f5c5SAndroid Build Coastguard Worker { 61*8975f5c5SAndroid Build Coastguard Worker return ((mValid == other.mValid) && (!mValid || (mValue == other.mValue))); 62*8975f5c5SAndroid Build Coastguard Worker } 63*8975f5c5SAndroid Build Coastguard Worker 64*8975f5c5SAndroid Build Coastguard Worker bool operator!=(const Optional &other) const { return !(*this == other); } 65*8975f5c5SAndroid Build Coastguard Worker 66*8975f5c5SAndroid Build Coastguard Worker bool operator==(const T &value) const { return mValid && (mValue == value); } 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker bool operator!=(const T &value) const { return !(*this == value); } 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker private: 71*8975f5c5SAndroid Build Coastguard Worker bool mValid; 72*8975f5c5SAndroid Build Coastguard Worker T mValue; 73*8975f5c5SAndroid Build Coastguard Worker }; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker #endif // COMMON_OPTIONAL_H_ 76