mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-01-21 20:08:20 +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
|