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