added iOS source code
[wl-app.git] / iOS / Pods / Realm / include / core / realm / util / overload.hpp
1 /*************************************************************************
2  *
3  * Copyright 2017 Realm Inc.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  **************************************************************************/
18
19 #ifndef REALM_UTIL_OVERLOAD_HPP
20 #define REALM_UTIL_OVERLOAD_HPP
21
22 #include <utility>
23
24 namespace realm {
25
26 namespace _impl {
27
28 template<typename Fn, typename... Fns>
29 struct Overloaded;
30
31 } // namespace _impl
32
33
34 namespace util {
35
36 // Declare an overload set using lambdas or other function objects.
37 // A minimal version of C++ Library Evolution Working Group proposal P0051R2.
38
39 template<typename... Fns>
40 _impl::Overloaded<Fns...> overload(Fns&&... f)
41 {
42     return _impl::Overloaded<Fns...>(std::forward<Fns>(f)...);
43 }
44
45 } // namespace util
46
47
48 namespace _impl {
49
50 template<typename Fn, typename... Fns>
51 struct Overloaded : Fn, Overloaded<Fns...> {
52     template<typename U, typename... Rest>
53     Overloaded(U&& fn, Rest&&... rest) : Fn(std::forward<U>(fn)), Overloaded<Fns...>(std::forward<Rest>(rest)...) { }
54
55     using Fn::operator();
56     using Overloaded<Fns...>::operator();
57 };
58
59 template<typename Fn>
60 struct Overloaded<Fn> : Fn {
61     template<typename U>
62     Overloaded(U&& fn) : Fn(std::forward<U>(fn)) { }
63
64     using Fn::operator();
65 };
66
67 } // namespace _impl
68 } // namespace realm
69
70 #endif // REALM_UTIL_OVERLOAD_HPP