mirror of
https://github.com/facebook/sapling.git
synced 2024-10-04 22:07:44 +03:00
496e469ae1
Summary: std::visit is awkward. We typically do a lot of `if constexpr`. It's nice to match with a set of lambda overloads instead. Reviewed By: mshroyer Differential Revision: D45629520 fbshipit-source-id: f4102365a97cfd92910a013ddb6475fed3863eb9
41 lines
870 B
C++
41 lines
870 B
C++
/*
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This software may be used and distributed according to the terms of the
|
|
* GNU General Public License version 2.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <variant>
|
|
|
|
namespace facebook::eden {
|
|
|
|
namespace detail {
|
|
|
|
template <typename... Cases>
|
|
struct overloaded : Cases... {
|
|
overloaded(Cases&&... cases) : Cases{std::forward<Cases>(cases)}... {}
|
|
|
|
using Cases::operator()...;
|
|
};
|
|
|
|
template <typename... Ts>
|
|
overloaded(Ts...) -> overloaded<Ts...>;
|
|
|
|
} // namespace detail
|
|
|
|
/**
|
|
* Type-safe, ergonomic pattern matching on std::variant.
|
|
*
|
|
* See MatchTest.cpp for examples.
|
|
*/
|
|
template <typename Variant, typename... Cases>
|
|
decltype(auto) match(Variant&& v, Cases&&... cases) {
|
|
return std::visit(
|
|
detail::overloaded(std::forward<Cases>(cases)...),
|
|
std::forward<Variant>(v));
|
|
}
|
|
|
|
} // namespace facebook::eden
|