xref: /aosp_15_r20/external/pytorch/c10/util/overloaded.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #pragma once
2*da0073e9SAndroid Build Coastguard Worker 
3*da0073e9SAndroid Build Coastguard Worker #include <memory>
4*da0073e9SAndroid Build Coastguard Worker namespace c10 {
5*da0073e9SAndroid Build Coastguard Worker namespace detail {
6*da0073e9SAndroid Build Coastguard Worker 
7*da0073e9SAndroid Build Coastguard Worker template <class... Ts>
8*da0073e9SAndroid Build Coastguard Worker struct overloaded_t {};
9*da0073e9SAndroid Build Coastguard Worker 
10*da0073e9SAndroid Build Coastguard Worker template <class T0>
11*da0073e9SAndroid Build Coastguard Worker struct overloaded_t<T0> : T0 {
12*da0073e9SAndroid Build Coastguard Worker   using T0::operator();
13*da0073e9SAndroid Build Coastguard Worker   overloaded_t(T0 t0) : T0(std::move(t0)) {}
14*da0073e9SAndroid Build Coastguard Worker };
15*da0073e9SAndroid Build Coastguard Worker template <class T0, class... Ts>
16*da0073e9SAndroid Build Coastguard Worker struct overloaded_t<T0, Ts...> : T0, overloaded_t<Ts...> {
17*da0073e9SAndroid Build Coastguard Worker   using T0::operator();
18*da0073e9SAndroid Build Coastguard Worker   using overloaded_t<Ts...>::operator();
19*da0073e9SAndroid Build Coastguard Worker   overloaded_t(T0 t0, Ts... ts)
20*da0073e9SAndroid Build Coastguard Worker       : T0(std::move(t0)), overloaded_t<Ts...>(std::move(ts)...) {}
21*da0073e9SAndroid Build Coastguard Worker };
22*da0073e9SAndroid Build Coastguard Worker 
23*da0073e9SAndroid Build Coastguard Worker } // namespace detail
24*da0073e9SAndroid Build Coastguard Worker 
25*da0073e9SAndroid Build Coastguard Worker // Construct an overloaded callable combining multiple callables, e.g. lambdas
26*da0073e9SAndroid Build Coastguard Worker template <class... Ts>
27*da0073e9SAndroid Build Coastguard Worker detail::overloaded_t<Ts...> overloaded(Ts... ts) {
28*da0073e9SAndroid Build Coastguard Worker   return {std::move(ts)...};
29*da0073e9SAndroid Build Coastguard Worker }
30*da0073e9SAndroid Build Coastguard Worker 
31*da0073e9SAndroid Build Coastguard Worker } // namespace c10
32