1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright (c) MapBox All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: BSD-3-Clause 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #ifndef MAPBOX_UTIL_OPTIONAL_HPP 7*89c4ff92SAndroid Build Coastguard Worker #define MAPBOX_UTIL_OPTIONAL_HPP 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #pragma message("This implementation of optional is deprecated. See https://github.com/mapbox/variant/issues/64.") 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <type_traits> 12*89c4ff92SAndroid Build Coastguard Worker #include <utility> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker #include <mapbox/variant.hpp> 15*89c4ff92SAndroid Build Coastguard Worker 16*89c4ff92SAndroid Build Coastguard Worker namespace mapbox { 17*89c4ff92SAndroid Build Coastguard Worker namespace util { 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker template <typename T> 20*89c4ff92SAndroid Build Coastguard Worker class optional 21*89c4ff92SAndroid Build Coastguard Worker { 22*89c4ff92SAndroid Build Coastguard Worker static_assert(!std::is_reference<T>::value, "optional doesn't support references"); 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker struct none_type 25*89c4ff92SAndroid Build Coastguard Worker { 26*89c4ff92SAndroid Build Coastguard Worker }; 27*89c4ff92SAndroid Build Coastguard Worker 28*89c4ff92SAndroid Build Coastguard Worker variant<none_type, T> variant_; 29*89c4ff92SAndroid Build Coastguard Worker 30*89c4ff92SAndroid Build Coastguard Worker public: 31*89c4ff92SAndroid Build Coastguard Worker optional() = default; 32*89c4ff92SAndroid Build Coastguard Worker optional(optional const & rhs)33*89c4ff92SAndroid Build Coastguard Worker optional(optional const& rhs) 34*89c4ff92SAndroid Build Coastguard Worker { 35*89c4ff92SAndroid Build Coastguard Worker if (this != &rhs) 36*89c4ff92SAndroid Build Coastguard Worker { // protect against invalid self-assignment 37*89c4ff92SAndroid Build Coastguard Worker variant_ = rhs.variant_; 38*89c4ff92SAndroid Build Coastguard Worker } 39*89c4ff92SAndroid Build Coastguard Worker } 40*89c4ff92SAndroid Build Coastguard Worker optional(T const & v)41*89c4ff92SAndroid Build Coastguard Worker optional(T const& v) { variant_ = v; } 42*89c4ff92SAndroid Build Coastguard Worker operator bool() const43*89c4ff92SAndroid Build Coastguard Worker explicit operator bool() const noexcept { return variant_.template is<T>(); } 44*89c4ff92SAndroid Build Coastguard Worker get() const45*89c4ff92SAndroid Build Coastguard Worker T const& get() const { return variant_.template get<T>(); } get()46*89c4ff92SAndroid Build Coastguard Worker T& get() { return variant_.template get<T>(); } 47*89c4ff92SAndroid Build Coastguard Worker operator *() const48*89c4ff92SAndroid Build Coastguard Worker T const& operator*() const { return this->get(); } operator *()49*89c4ff92SAndroid Build Coastguard Worker T operator*() { return this->get(); } 50*89c4ff92SAndroid Build Coastguard Worker operator =(T const & v)51*89c4ff92SAndroid Build Coastguard Worker optional& operator=(T const& v) 52*89c4ff92SAndroid Build Coastguard Worker { 53*89c4ff92SAndroid Build Coastguard Worker variant_ = v; 54*89c4ff92SAndroid Build Coastguard Worker return *this; 55*89c4ff92SAndroid Build Coastguard Worker } 56*89c4ff92SAndroid Build Coastguard Worker operator =(optional const & rhs)57*89c4ff92SAndroid Build Coastguard Worker optional& operator=(optional const& rhs) 58*89c4ff92SAndroid Build Coastguard Worker { 59*89c4ff92SAndroid Build Coastguard Worker if (this != &rhs) 60*89c4ff92SAndroid Build Coastguard Worker { 61*89c4ff92SAndroid Build Coastguard Worker variant_ = rhs.variant_; 62*89c4ff92SAndroid Build Coastguard Worker } 63*89c4ff92SAndroid Build Coastguard Worker return *this; 64*89c4ff92SAndroid Build Coastguard Worker } 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard Worker template <typename... Args> emplace(Args &&...args)67*89c4ff92SAndroid Build Coastguard Worker void emplace(Args&&... args) 68*89c4ff92SAndroid Build Coastguard Worker { 69*89c4ff92SAndroid Build Coastguard Worker variant_ = T{std::forward<Args>(args)...}; 70*89c4ff92SAndroid Build Coastguard Worker } 71*89c4ff92SAndroid Build Coastguard Worker reset()72*89c4ff92SAndroid Build Coastguard Worker void reset() { variant_ = none_type{}; } 73*89c4ff92SAndroid Build Coastguard Worker 74*89c4ff92SAndroid Build Coastguard Worker }; // class optional 75*89c4ff92SAndroid Build Coastguard Worker 76*89c4ff92SAndroid Build Coastguard Worker } // namespace util 77*89c4ff92SAndroid Build Coastguard Worker } // namespace mapbox 78*89c4ff92SAndroid Build Coastguard Worker 79*89c4ff92SAndroid Build Coastguard Worker #endif // MAPBOX_UTIL_OPTIONAL_HPP 80