mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-01-21 12:05:05 +00:00
75 lines
1.5 KiB
C++
75 lines
1.5 KiB
C++
#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
|