Sha256: 0b7666c9111b3f3e41f151633593d33677d6a503dce5c8fd0df84f07daaa1ffd
Contents?: true
Size: 1.54 KB
Versions: 14
Compression:
Stored size: 1.54 KB
Contents
#ifndef MAPBOX_UTIL_OPTIONAL_HPP #define MAPBOX_UTIL_OPTIONAL_HPP #pragma message("This implementation of optional is deprecated. See https://github.com/mapbox/variant/issues/64.") #include <type_traits> #include <utility> #include <mapbox/variant.hpp> namespace mapbox { namespace util { template <typename T> class optional { static_assert(!std::is_reference<T>::value, "optional doesn't support references"); struct none_type { }; variant<none_type, T> 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>(); } T const& get() const { return variant_.template get<T>(); } T& get() { return variant_.template get<T>(); } 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 <typename... Args> void emplace(Args&&... args) { variant_ = T{std::forward<Args>(args)...}; } void reset() { variant_ = none_type{}; } }; // class optional } // namespace util } // namespace mapbox #endif // MAPBOX_UTIL_OPTIONAL_HPP
Version data entries
14 entries across 14 versions & 1 rubygems