#pragma once #include #include #include namespace mbgl { namespace util { class peer { public: peer() noexcept : storage(nullptr, noop_deleter) {} template peer(T&& value) noexcept : storage(new std::decay_t(std::forward(value)), cast_deleter>) { static_assert(!std::is_same>::value, "Peer must not wrap itself."); } bool has_value() const noexcept { return static_cast(storage); } template T& get() noexcept { return *reinterpret_cast(storage.get()); } private: template static void cast_deleter(void* ptr) noexcept { delete reinterpret_cast(ptr); } static void noop_deleter(void*) noexcept {} using storage_t = std::unique_ptr; storage_t storage; }; } // namespace util } // namespace mbgl