xref: /aosp_15_r20/external/libtextclassifier/native/utils/optional.h (revision 993b0882672172b81d12fad7a7ac0c3e5c824a12)
1*993b0882SAndroid Build Coastguard Worker /*
2*993b0882SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*993b0882SAndroid Build Coastguard Worker  *
4*993b0882SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*993b0882SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*993b0882SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*993b0882SAndroid Build Coastguard Worker  *
8*993b0882SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*993b0882SAndroid Build Coastguard Worker  *
10*993b0882SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*993b0882SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*993b0882SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*993b0882SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*993b0882SAndroid Build Coastguard Worker  * limitations under the License.
15*993b0882SAndroid Build Coastguard Worker  */
16*993b0882SAndroid Build Coastguard Worker 
17*993b0882SAndroid Build Coastguard Worker #ifndef LIBTEXTCLASSIFIER_UTILS_OPTIONAL_H_
18*993b0882SAndroid Build Coastguard Worker #define LIBTEXTCLASSIFIER_UTILS_OPTIONAL_H_
19*993b0882SAndroid Build Coastguard Worker 
20*993b0882SAndroid Build Coastguard Worker #include "utils/base/logging.h"
21*993b0882SAndroid Build Coastguard Worker 
22*993b0882SAndroid Build Coastguard Worker namespace libtextclassifier3 {
23*993b0882SAndroid Build Coastguard Worker 
24*993b0882SAndroid Build Coastguard Worker // Holds an optional value.
25*993b0882SAndroid Build Coastguard Worker template <class T>
26*993b0882SAndroid Build Coastguard Worker class Optional {
27*993b0882SAndroid Build Coastguard Worker  public:
Optional()28*993b0882SAndroid Build Coastguard Worker   Optional() : init_(false) {}
29*993b0882SAndroid Build Coastguard Worker 
Optional(const Optional & other)30*993b0882SAndroid Build Coastguard Worker   Optional(const Optional& other) {
31*993b0882SAndroid Build Coastguard Worker     init_ = other.init_;
32*993b0882SAndroid Build Coastguard Worker     if (other.init_) {
33*993b0882SAndroid Build Coastguard Worker       value_ = other.value_;
34*993b0882SAndroid Build Coastguard Worker     }
35*993b0882SAndroid Build Coastguard Worker   }
36*993b0882SAndroid Build Coastguard Worker 
Optional(T value)37*993b0882SAndroid Build Coastguard Worker   explicit Optional(T value) : init_(true), value_(value) {}
38*993b0882SAndroid Build Coastguard Worker 
39*993b0882SAndroid Build Coastguard Worker   Optional& operator=(Optional&& other) {
40*993b0882SAndroid Build Coastguard Worker     init_ = other.init_;
41*993b0882SAndroid Build Coastguard Worker     if (other.init_) {
42*993b0882SAndroid Build Coastguard Worker       value_ = std::move(other);
43*993b0882SAndroid Build Coastguard Worker     }
44*993b0882SAndroid Build Coastguard Worker     return *this;
45*993b0882SAndroid Build Coastguard Worker   }
46*993b0882SAndroid Build Coastguard Worker 
47*993b0882SAndroid Build Coastguard Worker   Optional& operator=(T&& other) {
48*993b0882SAndroid Build Coastguard Worker     init_ = true;
49*993b0882SAndroid Build Coastguard Worker     value_ = std::move(other);
50*993b0882SAndroid Build Coastguard Worker     return *this;
51*993b0882SAndroid Build Coastguard Worker   }
52*993b0882SAndroid Build Coastguard Worker 
has_value()53*993b0882SAndroid Build Coastguard Worker   constexpr bool has_value() const { return init_; }
54*993b0882SAndroid Build Coastguard Worker 
55*993b0882SAndroid Build Coastguard Worker   T const* operator->() const {
56*993b0882SAndroid Build Coastguard Worker     TC3_CHECK(init_) << "Bad optional access.";
57*993b0882SAndroid Build Coastguard Worker     return value_;
58*993b0882SAndroid Build Coastguard Worker   }
59*993b0882SAndroid Build Coastguard Worker 
value()60*993b0882SAndroid Build Coastguard Worker   T const& value() const& {
61*993b0882SAndroid Build Coastguard Worker     TC3_CHECK(init_) << "Bad optional access.";
62*993b0882SAndroid Build Coastguard Worker     return value_;
63*993b0882SAndroid Build Coastguard Worker   }
64*993b0882SAndroid Build Coastguard Worker 
value_or(T && default_value)65*993b0882SAndroid Build Coastguard Worker   T const& value_or(T&& default_value) const& {
66*993b0882SAndroid Build Coastguard Worker     return (init_ ? value_ : default_value);
67*993b0882SAndroid Build Coastguard Worker   }
68*993b0882SAndroid Build Coastguard Worker 
set(const T & value)69*993b0882SAndroid Build Coastguard Worker   void set(const T& value) {
70*993b0882SAndroid Build Coastguard Worker     init_ = true;
71*993b0882SAndroid Build Coastguard Worker     value_ = value;
72*993b0882SAndroid Build Coastguard Worker   }
73*993b0882SAndroid Build Coastguard Worker 
74*993b0882SAndroid Build Coastguard Worker  private:
75*993b0882SAndroid Build Coastguard Worker   bool init_;
76*993b0882SAndroid Build Coastguard Worker   T value_;
77*993b0882SAndroid Build Coastguard Worker };
78*993b0882SAndroid Build Coastguard Worker 
79*993b0882SAndroid Build Coastguard Worker }  // namespace libtextclassifier3
80*993b0882SAndroid Build Coastguard Worker 
81*993b0882SAndroid Build Coastguard Worker #endif  // LIBTEXTCLASSIFIER_UTILS_OPTIONAL_H_
82