1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright (c) MapBox All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: BSD-3-Clause 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #ifndef MAPBOX_UTIL_VARIANT_VISITOR_HPP 7*89c4ff92SAndroid Build Coastguard Worker #define MAPBOX_UTIL_VARIANT_VISITOR_HPP 8*89c4ff92SAndroid Build Coastguard Worker 9*89c4ff92SAndroid Build Coastguard Worker #include <utility> 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker namespace mapbox { 12*89c4ff92SAndroid Build Coastguard Worker namespace util { 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker template <typename... Fns> 15*89c4ff92SAndroid Build Coastguard Worker struct visitor; 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker template <typename Fn> 18*89c4ff92SAndroid Build Coastguard Worker struct visitor<Fn> : Fn 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker using Fn::operator(); 21*89c4ff92SAndroid Build Coastguard Worker 22*89c4ff92SAndroid Build Coastguard Worker template<typename T> visitormapbox::util::visitor23*89c4ff92SAndroid Build Coastguard Worker visitor(T&& fn) : Fn(std::forward<T>(fn)) {} 24*89c4ff92SAndroid Build Coastguard Worker }; 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker template <typename Fn, typename... Fns> 27*89c4ff92SAndroid Build Coastguard Worker struct visitor<Fn, Fns...> : Fn, visitor<Fns...> 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker using Fn::operator(); 30*89c4ff92SAndroid Build Coastguard Worker using visitor<Fns...>::operator(); 31*89c4ff92SAndroid Build Coastguard Worker 32*89c4ff92SAndroid Build Coastguard Worker template<typename T, typename... Ts> visitormapbox::util::visitor33*89c4ff92SAndroid Build Coastguard Worker visitor(T&& fn, Ts&&... fns) 34*89c4ff92SAndroid Build Coastguard Worker : Fn(std::forward<T>(fn)) 35*89c4ff92SAndroid Build Coastguard Worker , visitor<Fns...>(std::forward<Ts>(fns)...) {} 36*89c4ff92SAndroid Build Coastguard Worker }; 37*89c4ff92SAndroid Build Coastguard Worker 38*89c4ff92SAndroid Build Coastguard Worker template <typename... Fns> make_visitor(Fns &&...fns)39*89c4ff92SAndroid Build Coastguard Workervisitor<typename std::decay<Fns>::type...> make_visitor(Fns&&... fns) 40*89c4ff92SAndroid Build Coastguard Worker { 41*89c4ff92SAndroid Build Coastguard Worker return visitor<typename std::decay<Fns>::type...> 42*89c4ff92SAndroid Build Coastguard Worker (std::forward<Fns>(fns)...); 43*89c4ff92SAndroid Build Coastguard Worker } 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker } // namespace util 46*89c4ff92SAndroid Build Coastguard Worker } // namespace mapbox 47*89c4ff92SAndroid Build Coastguard Worker 48*89c4ff92SAndroid Build Coastguard Worker #endif // MAPBOX_UTIL_VARIANT_VISITOR_HPP 49