From 43a97878ce14b72f0981164f87f2e35e14151312 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:22:09 +0200 Subject: Adding upstream version 110.0.1. Signed-off-by: Daniel Baumann --- mfbt/ResultVariant.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 mfbt/ResultVariant.h (limited to 'mfbt/ResultVariant.h') diff --git a/mfbt/ResultVariant.h b/mfbt/ResultVariant.h new file mode 100644 index 0000000000..790ff8d642 --- /dev/null +++ b/mfbt/ResultVariant.h @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * vim: set ts=8 sts=2 et sw=2 tw=80: + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* A type suitable for returning either a value or an error from a function. */ + +#ifndef mozilla_ResultVariant_h +#define mozilla_ResultVariant_h + +#include "mozilla/MaybeStorageBase.h" +#include "mozilla/Result.h" +#include "mozilla/Variant.h" + +namespace mozilla::detail { + +template +class ResultImplementation { + mozilla::Variant mStorage; + + public: + static constexpr PackingStrategy Strategy = PackingStrategy::Variant; + + ResultImplementation(ResultImplementation&&) = default; + ResultImplementation(const ResultImplementation&) = delete; + ResultImplementation& operator=(const ResultImplementation&) = delete; + ResultImplementation& operator=(ResultImplementation&&) = default; + + explicit ResultImplementation(V&& aValue) : mStorage(std::move(aValue)) {} + explicit ResultImplementation(const V& aValue) : mStorage(aValue) {} + template + explicit ResultImplementation(std::in_place_t, Args&&... aArgs) + : mStorage(VariantType{}, std::forward(aArgs)...) {} + + explicit ResultImplementation(const E& aErrorValue) : mStorage(aErrorValue) {} + explicit ResultImplementation(E&& aErrorValue) + : mStorage(std::move(aErrorValue)) {} + + bool isOk() const { return mStorage.template is(); } + + // The callers of these functions will assert isOk() has the proper value, so + // these functions (in all ResultImplementation specializations) don't need + // to do so. + V unwrap() { return std::move(mStorage.template as()); } + const V& inspect() const { return mStorage.template as(); } + + E unwrapErr() { return std::move(mStorage.template as()); } + const E& inspectErr() const { return mStorage.template as(); } + + void updateAfterTracing(V&& aValue) { + mStorage.template emplace(std::move(aValue)); + } + void updateErrorAfterTracing(E&& aErrorValue) { + mStorage.template emplace(std::move(aErrorValue)); + } +}; + +} // namespace mozilla::detail + +#endif // mozilla_ResultVariant_h -- cgit v1.2.3