sapling/eden/fs/utils/Match.h
Chad Austin 496e469ae1 introduce a useful pattern-match function over std::visit
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
2023-05-11 11:10:01 -07:00

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