diff options
author | John Hodge (bugs) <tpg@mutabah.net> | 2017-05-14 12:01:45 +0800 |
---|---|---|
committer | John Hodge (bugs) <tpg@mutabah.net> | 2017-05-14 12:01:45 +0800 |
commit | 1d2fe7681219700998c8ecbdb8ed5acab66578df (patch) | |
tree | 0d38e8ab5fd80c890d3dec67a0596abfc7a4f0cd /Notes/BigChanges/Variant.md | |
parent | c6fca061dd134068c831aefd88d9535a30f423ed (diff) | |
parent | fde22b3f03d802231985b8ded567cba16cb5aa00 (diff) | |
download | mrust-1d2fe7681219700998c8ecbdb8ed5acab66578df.tar.gz |
Merge branch 'master' of https://github.com/thepowersgang/mrustc
# Conflicts:
# src/common.hpp
# src/hir/deserialise.cpp
# src/hir_typeck/static.cpp
# src/mir/from_hir.cpp
# src/mir/from_hir.hpp
# src/mir/from_hir_match.cpp
# src/mir/helpers.hpp
# src/mir/mir_builder.cpp
Diffstat (limited to 'Notes/BigChanges/Variant.md')
-rw-r--r-- | Notes/BigChanges/Variant.md | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/Notes/BigChanges/Variant.md b/Notes/BigChanges/Variant.md new file mode 100644 index 00000000..55bb3bb0 --- /dev/null +++ b/Notes/BigChanges/Variant.md @@ -0,0 +1,70 @@ + +(the below is from @ubsan) + +``` +// one can define their own variant, but I'm lazy +#include <variant> +#include <type_traits> +#include <iostream> + +template <typename F, typename T, typename Void = void> +struct return_type {}; + +template <typename F, typename T> +struct return_type<T, F, std::void_t< + decltype(std::declval<F>()(std::declval<T>())) +>> { + using type = decltype(std::declval<F>()(std::declval<T>())); +}; + +template <typename F, typename T> +using return_type_t = typename return_type<T, F>::type; + +// not sure what to call this +template <typename F, typename... Ts> +struct common_return_type { + using type = std::common_type_t<return_type_t<F, Ts>...>; +}; + +template <typename F, typename... Ts> +using common_return_type_t = typename common_return_type<F, Ts...>::type; + +template <typename F, typename... Ts> +auto match( + std::variant<Ts...>& variant, F&& functor +) -> common_return_type_t<F, Ts...> { + // you could also use static_assert to make it SFINAE-unfriendly + return std::visit(functor, variant); +} + +template <typename... Fs> +struct overloaded : Fs... { + using Fs::operator()...; + overloaded(Fs&&... fs) : Fs(std::forward<Fs>(fs))... { } +}; + +int main() { + auto var = std::variant<int, std::string>(0); + std::cout << match(var, overloaded( + [](int i) { return i; }, + [](std::string s) { return 0; } + )); +} +``` + + + +ALTERNATIVE +=========== + +Could just update TU to have: +`` +stmt.if_let( +stmt.match_def( +stmt.match( + [](::MIR::LValue::Data_Assign& se) { + }, + [](::MIR::LValue::Data_Drop& se) { + } + ); +``` |