mini-llvm 0.1.0
Loading...
Searching...
No Matches
SetOps.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <concepts>
6#include <iterator>
7#include <type_traits>
8#include <utility>
9
10namespace mini_llvm {
11
12namespace detail {
13
14template <typename T>
15concept SetImpl = requires {
16 requires std::forward_iterator<typename T::iterator>;
17 requires std::forward_iterator<typename T::const_iterator>;
18 requires std::same_as<typename std::iterator_traits<typename T::iterator>::value_type, typename T::value_type>;
19 requires std::same_as<typename std::iterator_traits<typename T::const_iterator>::value_type, typename T::value_type>;
20 { std::declval<T &>().begin() } -> std::same_as<typename T::iterator>;
21 { std::declval<T &>().end() } -> std::same_as<typename T::iterator>;
22 { std::declval<const T &>().begin() } -> std::same_as<typename T::const_iterator>;
23 { std::declval<const T &>().end() } -> std::same_as<typename T::const_iterator>;
24 { std::declval<T &>().contains(std::declval<const typename T::value_type &>()) } -> std::convertible_to<bool>;
25 { std::declval<const T &>().contains(std::declval<const typename T::value_type &>()) } -> std::convertible_to<bool>;
26 std::declval<T &>().insert(std::declval<const typename T::value_type &>());
27 std::declval<T &>().erase(std::declval<const typename T::value_type &>());
28 { std::declval<T &>().erase(std::declval<const typename T::iterator &>()) } -> std::same_as<typename T::iterator>;
29 { std::declval<T &>().erase(std::declval<const typename T::const_iterator &>()) } -> std::same_as<typename T::iterator>;
30};
31
32template <typename T>
33concept Set = SetImpl<std::remove_cv_t<std::remove_reference_t<T>>>;
34
35} // namespace detail
36
37namespace set_ops {
38
39template <typename S, typename T>
40 requires detail::Set<S> && detail::Set<T>
41S &operator|=(S &lhs, const T &rhs) {
42 for (const auto &value : rhs) {
43 lhs.insert(value);
44 }
45 return lhs;
46}
47
48template <typename S, typename T>
49 requires detail::Set<S> && detail::Set<T> && std::is_rvalue_reference_v<T &&>
50S &operator|=(S &lhs, T &&rhs) {
51 for (auto &value : rhs) {
52 lhs.insert(std::move(value));
53 }
54 return lhs;
55}
56
57template <typename S, typename T>
58 requires detail::Set<S> && detail::Set<T>
59S &operator&=(S &lhs, const T &rhs) {
60 for (auto i = lhs.begin(); i != lhs.end();) {
61 if (!rhs.contains(*i)) {
62 i = lhs.erase(i);
63 } else {
64 ++i;
65 }
66 }
67 return lhs;
68}
69
70template <typename S, typename T>
71 requires detail::Set<S> && detail::Set<T>
72S &operator-=(S &lhs, const T &rhs) {
73 for (const auto &element : rhs) {
74 lhs.erase(element);
75 }
76 return lhs;
77}
78
79template <typename S, typename T>
80 requires detail::Set<S> && detail::Set<T>
81S operator|(S lhs, const T &rhs) {
82 return lhs |= rhs;
83}
84
85template <typename S, typename T>
86 requires detail::Set<S> && detail::Set<T> && std::is_rvalue_reference_v<T &&>
87S operator|(S lhs, T &&rhs) {
88 return lhs |= std::move(rhs);
89}
90
91template <typename S, typename T>
92 requires detail::Set<S> && detail::Set<T>
93S operator&(S lhs, const T &rhs) {
94 return lhs &= rhs;
95}
96
97template <typename S, typename T>
98 requires detail::Set<S> && detail::Set<T>
99S operator-(S lhs, const T &rhs) {
100 return lhs -= rhs;
101}
102
103} // namespace set_ops
104
105} // namespace mini_llvm
Definition SetOps.h:37
S operator-(S lhs, const T &rhs)
Definition SetOps.h:99
S & operator|=(S &lhs, const T &rhs)
Definition SetOps.h:41
S operator&(S lhs, const T &rhs)
Definition SetOps.h:93
S & operator&=(S &lhs, const T &rhs)
Definition SetOps.h:59
S & operator-=(S &lhs, const T &rhs)
Definition SetOps.h:72
S operator|(S lhs, const T &rhs)
Definition SetOps.h:81
Definition GraphColoringAllocator.h:13