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