xref: /aosp_15_r20/external/armnn/third-party/mapbox/variant_visitor.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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 Worker visitor<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