blob: a5657d3451ac0aba0f903cbcb805e40056107fbc [file] [log] [blame]
Jim Flynn6217c3d2022-06-14 10:58:23 +01001//
2// Copyright (c) MapBox All rights reserved.
3// SPDX-License-Identifier: BSD-3-Clause
4//
5
James Ward22a4e152020-09-25 11:43:21 +01006#ifndef MAPBOX_UTIL_VARIANT_VISITOR_HPP
7#define MAPBOX_UTIL_VARIANT_VISITOR_HPP
8
9#include <utility>
10
11namespace mapbox {
12namespace util {
13
14template <typename... Fns>
15struct visitor;
16
17template <typename Fn>
18struct visitor<Fn> : Fn
19{
20 using Fn::operator();
21
22 template<typename T>
Jim Flynn6217c3d2022-06-14 10:58:23 +010023 visitor(T&& fn) : Fn(std::forward<T>(fn)) {}
James Ward22a4e152020-09-25 11:43:21 +010024};
25
26template <typename Fn, typename... Fns>
27struct visitor<Fn, Fns...> : Fn, visitor<Fns...>
28{
29 using Fn::operator();
30 using visitor<Fns...>::operator();
31
32 template<typename T, typename... Ts>
33 visitor(T&& fn, Ts&&... fns)
34 : Fn(std::forward<T>(fn))
35 , visitor<Fns...>(std::forward<Ts>(fns)...) {}
36};
37
38template <typename... 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}
Jim Flynn6217c3d2022-06-14 10:58:23 +010044
James Ward22a4e152020-09-25 11:43:21 +010045} // namespace util
46} // namespace mapbox
47
48#endif // MAPBOX_UTIL_VARIANT_VISITOR_HPP