mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-02 08:25:40 +02:00
Copy of variant-1.1.4 (02bd1ac)
This commit is contained in:
@@ -0,0 +1,74 @@
|
|||||||
|
#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
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
#ifndef MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
|
||||||
|
#define MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
|
||||||
|
|
||||||
|
// Based on variant/recursive_wrapper.hpp from boost.
|
||||||
|
//
|
||||||
|
// Original license:
|
||||||
|
//
|
||||||
|
// Copyright (c) 2002-2003
|
||||||
|
// Eric Friedman, Itay Maman
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace mapbox {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class recursive_wrapper
|
||||||
|
{
|
||||||
|
|
||||||
|
T* p_;
|
||||||
|
|
||||||
|
void assign(T const& rhs)
|
||||||
|
{
|
||||||
|
this->get() = rhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
using type = T;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor default initializes the internally stored value.
|
||||||
|
* For POD types this means nothing is done and the storage is
|
||||||
|
* uninitialized.
|
||||||
|
*
|
||||||
|
* @throws std::bad_alloc if there is insufficient memory for an object
|
||||||
|
* of type T.
|
||||||
|
* @throws any exception thrown by the default constructur of T.
|
||||||
|
*/
|
||||||
|
recursive_wrapper()
|
||||||
|
: p_(new T){}
|
||||||
|
|
||||||
|
~recursive_wrapper() noexcept { delete p_; }
|
||||||
|
|
||||||
|
recursive_wrapper(recursive_wrapper const& operand)
|
||||||
|
: p_(new T(operand.get())) {}
|
||||||
|
|
||||||
|
recursive_wrapper(T const& operand)
|
||||||
|
: p_(new T(operand)) {}
|
||||||
|
|
||||||
|
recursive_wrapper(recursive_wrapper&& operand)
|
||||||
|
: p_(new T(std::move(operand.get()))) {}
|
||||||
|
|
||||||
|
recursive_wrapper(T&& operand)
|
||||||
|
: p_(new T(std::move(operand))) {}
|
||||||
|
|
||||||
|
inline recursive_wrapper& operator=(recursive_wrapper const& rhs)
|
||||||
|
{
|
||||||
|
assign(rhs.get());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline recursive_wrapper& operator=(T const& rhs)
|
||||||
|
{
|
||||||
|
assign(rhs);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void swap(recursive_wrapper& operand) noexcept
|
||||||
|
{
|
||||||
|
T* temp = operand.p_;
|
||||||
|
operand.p_ = p_;
|
||||||
|
p_ = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
recursive_wrapper& operator=(recursive_wrapper&& rhs) noexcept
|
||||||
|
{
|
||||||
|
swap(rhs);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
recursive_wrapper& operator=(T&& rhs)
|
||||||
|
{
|
||||||
|
get() = std::move(rhs);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
T& get()
|
||||||
|
{
|
||||||
|
assert(p_);
|
||||||
|
return *get_pointer();
|
||||||
|
}
|
||||||
|
|
||||||
|
T const& get() const
|
||||||
|
{
|
||||||
|
assert(p_);
|
||||||
|
return *get_pointer();
|
||||||
|
}
|
||||||
|
|
||||||
|
T* get_pointer() { return p_; }
|
||||||
|
|
||||||
|
const T* get_pointer() const { return p_; }
|
||||||
|
|
||||||
|
operator T const&() const { return this->get(); }
|
||||||
|
|
||||||
|
operator T&() { return this->get(); }
|
||||||
|
|
||||||
|
}; // class recursive_wrapper
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline void swap(recursive_wrapper<T>& lhs, recursive_wrapper<T>& rhs) noexcept
|
||||||
|
{
|
||||||
|
lhs.swap(rhs);
|
||||||
|
}
|
||||||
|
} // namespace util
|
||||||
|
} // namespace mapbox
|
||||||
|
|
||||||
|
#endif // MAPBOX_UTIL_RECURSIVE_WRAPPER_HPP
|
||||||
+1013
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,45 @@
|
|||||||
|
#ifndef MAPBOX_UTIL_VARIANT_IO_HPP
|
||||||
|
#define MAPBOX_UTIL_VARIANT_IO_HPP
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
|
||||||
|
#include <mapbox/variant.hpp>
|
||||||
|
|
||||||
|
namespace mapbox {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
// operator<< helper
|
||||||
|
template <typename Out>
|
||||||
|
class printer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit printer(Out& out)
|
||||||
|
: out_(out) {}
|
||||||
|
printer& operator=(printer const&) = delete;
|
||||||
|
|
||||||
|
// visitor
|
||||||
|
template <typename T>
|
||||||
|
void operator()(T const& operand) const
|
||||||
|
{
|
||||||
|
out_ << operand;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Out& out_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// operator<<
|
||||||
|
template <typename CharT, typename Traits, typename... Types>
|
||||||
|
VARIANT_INLINE std::basic_ostream<CharT, Traits>&
|
||||||
|
operator<<(std::basic_ostream<CharT, Traits>& out, variant<Types...> const& rhs)
|
||||||
|
{
|
||||||
|
detail::printer<std::basic_ostream<CharT, Traits>> visitor(out);
|
||||||
|
apply_visitor(visitor, rhs);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
} // namespace util
|
||||||
|
} // namespace mapbox
|
||||||
|
|
||||||
|
#endif // MAPBOX_UTIL_VARIANT_IO_HPP
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#ifndef MAPBOX_UTIL_VARIANT_VISITOR_HPP
|
||||||
|
#define MAPBOX_UTIL_VARIANT_VISITOR_HPP
|
||||||
|
|
||||||
|
namespace mapbox {
|
||||||
|
namespace util {
|
||||||
|
|
||||||
|
template <typename... Fns>
|
||||||
|
struct visitor;
|
||||||
|
|
||||||
|
template <typename Fn>
|
||||||
|
struct visitor<Fn> : Fn
|
||||||
|
{
|
||||||
|
using type = Fn;
|
||||||
|
using Fn::operator();
|
||||||
|
|
||||||
|
visitor(Fn fn) : Fn(fn) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Fn, typename... Fns>
|
||||||
|
struct visitor<Fn, Fns...> : Fn, visitor<Fns...>
|
||||||
|
{
|
||||||
|
using type = visitor;
|
||||||
|
using Fn::operator();
|
||||||
|
using visitor<Fns...>::operator();
|
||||||
|
|
||||||
|
visitor(Fn fn, Fns... fns) : Fn(fn), visitor<Fns...>(fns...) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename... Fns>
|
||||||
|
visitor<Fns...> make_visitor(Fns... fns)
|
||||||
|
{
|
||||||
|
return visitor<Fns...>(fns...);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace util
|
||||||
|
} // namespace mapbox
|
||||||
|
|
||||||
|
#endif // MAPBOX_UTIL_VARIANT_VISITOR_HPP
|
||||||
Reference in New Issue
Block a user