#ifndef MAPBOX_UTIL_OPTIONAL_HPP #define MAPBOX_UTIL_OPTIONAL_HPP #include #include namespace mapbox { namespace util { template class optional { static_assert(!std::is_reference::value, "optional doesn't support references"); struct none_type { }; variant variant_; public: optional() = default; optional(optional const &rhs) { if (this != &rhs) { // protect against invalid self-assignment variant_ = rhs.variant_; } } optional(T const &v) { variant_ = v; } explicit operator bool() const noexcept { return variant_.template is(); } T const &get() const { return variant_.template get(); } T &get() { return variant_.template get(); } T const &operator*() const { return this->get(); } T operator*() { return this->get(); } optional &operator=(T const &v) { variant_ = v; return *this; } optional &operator=(optional const &rhs) { if (this != &rhs) { variant_ = rhs.variant_; } return *this; } template void emplace(Args &&... args) { variant_ = T{std::forward(args)...}; } void reset() { variant_ = none_type{}; } }; } } #endif