// Copyright 2018 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. #pragma once #include namespace Common { template class Result final { public: Result(ResultCode code) : m_variant{code} {} Result(const T& t) : m_variant{t} {} Result(T&& t) : m_variant{std::move(t)} {} explicit operator bool() const { return Succeeded(); } bool Succeeded() const { return std::holds_alternative(m_variant); } // Must only be called when Succeeded() returns false. ResultCode Error() const { return std::get(m_variant); } // Must only be called when Succeeded() returns true. const T& operator*() const { return std::get(m_variant); } const T* operator->() const { return &std::get(m_variant); } T& operator*() { return std::get(m_variant); } T* operator->() { return &std::get(m_variant); } private: std::variant m_variant; }; } // namespace Common