]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/mp11/set.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / mp11 / set.hpp
1 #ifndef BOOST_MP11_SET_HPP_INCLUDED
2 #define BOOST_MP11_SET_HPP_INCLUDED
3
4 // Copyright 2015 Peter Dimov.
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 //
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
10
11 #include <boost/mp11/utility.hpp>
12 #include <boost/mp11/detail/mp_list.hpp>
13 #include <type_traits>
14
15 namespace boost
16 {
17 namespace mp11
18 {
19
20 // mp_set_contains<S, V>
21 namespace detail
22 {
23
24 template<class S, class V> struct mp_set_contains_impl;
25
26 template<template<class...> class L, class... T, class V> struct mp_set_contains_impl<L<T...>, V>
27 {
28 using type = mp_to_bool<std::is_base_of<mp_identity<V>, mp_inherit<mp_identity<T>...>>>;
29 };
30
31 } // namespace detail
32
33 template<class S, class V> using mp_set_contains = typename detail::mp_set_contains_impl<S, V>::type;
34
35 // mp_set_push_back<S, T...>
36 namespace detail
37 {
38
39 template<class S, class... T> struct mp_set_push_back_impl;
40
41 template<template<class...> class L, class... U> struct mp_set_push_back_impl<L<U...>>
42 {
43 using type = L<U...>;
44 };
45
46 template<template<class...> class L, class... U, class T1, class... T> struct mp_set_push_back_impl<L<U...>, T1, T...>
47 {
48 using S = mp_if<mp_set_contains<L<U...>, T1>, L<U...>, L<U..., T1>>;
49 using type = typename mp_set_push_back_impl<S, T...>::type;
50 };
51
52 } // namespace detail
53
54 template<class S, class... T> using mp_set_push_back = typename detail::mp_set_push_back_impl<S, T...>::type;
55
56 // mp_set_push_front<S, T...>
57 namespace detail
58 {
59
60 template<class S, class... T> struct mp_set_push_front_impl;
61
62 template<template<class...> class L, class... U> struct mp_set_push_front_impl<L<U...>>
63 {
64 using type = L<U...>;
65 };
66
67 template<template<class...> class L, class... U, class T1> struct mp_set_push_front_impl<L<U...>, T1>
68 {
69 using type = mp_if<mp_set_contains<L<U...>, T1>, L<U...>, L<T1, U...>>;
70 };
71
72 template<template<class...> class L, class... U, class T1, class... T> struct mp_set_push_front_impl<L<U...>, T1, T...>
73 {
74 using S = typename mp_set_push_front_impl<L<U...>, T...>::type;
75 using type = typename mp_set_push_front_impl<S, T1>::type;
76 };
77
78 } // namespace detail
79
80 template<class S, class... T> using mp_set_push_front = typename detail::mp_set_push_front_impl<S, T...>::type;
81
82 // mp_is_set<S>
83 namespace detail
84 {
85
86 template<class S> struct mp_is_set_impl
87 {
88 using type = mp_false;
89 };
90
91 template<template<class...> class L, class... T> struct mp_is_set_impl<L<T...>>
92 {
93 using type = mp_to_bool<std::is_same<mp_list<T...>, mp_set_push_back<mp_list<>, T...>>>;
94 };
95
96 } // namespace detail
97
98 template<class S> using mp_is_set = typename detail::mp_is_set_impl<S>::type;
99
100 } // namespace mp11
101 } // namespace boost
102
103 #endif // #ifndef BOOST_MP11_SET_HPP_INCLUDED