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