xref: /aosp_15_r20/external/angle/src/common/Optional.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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