9#include "wmtk/utils/Logger.hpp"
14inline std::vector<T> set_intersection(
const std::vector<T>& v1,
const std::vector<T>& v2)
17 assert(std::is_sorted(v1.begin(), v1.end()));
20 assert(std::is_sorted(v2.begin(), v2.end()));
24 v.reserve(std::min(v1.size(), v2.size()));
25 std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v));
30inline void vector_unique(std::vector<T>& v)
33 std::sort(v.begin(), v.end());
34 v.erase(std::unique(v.begin(), v.end()), v.end());
38template <
class T,
typename Comp,
typename Equal>
39inline void vector_unique(std::vector<T>& v, Comp comp, Equal equal)
42 std::sort(v.begin(), v.end(), comp);
43 v.erase(std::unique(v.begin(), v.end(), equal), v.end());
49inline void vector_print(std::vector<T>& v)
51 wmtk::logger().info(
"vector {}", v);
55inline void vector_sort(std::vector<T>& v)
58 std::sort(v.begin(), v.end());
63inline bool vector_erase(std::vector<T>& v,
const T& t)
65 auto it = std::find(v.begin(), v.end(), t);
66 if (it == v.end())
return false;
72inline bool vector_contains(
const std::vector<T>& v,
const T& t)
74 auto it = std::find(v.begin(), v.end(), t);
75 if (it == v.end())
return false;
80inline bool set_erase(std::vector<T>& v,
const T& t)
82 assert(std::is_sorted(v.begin(), v.end()));
83 auto it = std::lower_bound(v.begin(), v.end(), t);
84 if (it == v.end() || *it != t)
return false;
90inline bool set_insert(std::vector<T>& vec,
const T& val)
92 assert(std::is_sorted(vec.begin(), vec.end()));
93 auto it = std::lower_bound(vec.begin(), vec.end(), val);
98std::vector<T> set_union(
const std::vector<T>& vec,
const std::vector<T>& vec2)
100 assert(std::is_sorted(vec.begin(), vec.end()));
101 assert(std::is_sorted(vec2.begin(), vec2.end()));
102 std::vector<T> merged;
103 merged.reserve(vec2.size() + vec.size());
104 std::merge(vec.begin(), vec.end(), vec2.begin(), vec2.end(), std::back_inserter(merged));
105 vector_unique(merged);
110void set_union_inplace(std::vector<T>& vec,
const std::vector<T>& vec2)
112 assert(std::is_sorted(vec.begin(), vec.end()));
113 assert(std::is_sorted(vec2.begin(), vec2.end()));
115 const auto boundary_it = vec.insert(vec.end(), vec2.begin(), vec2.end());
116 std::inplace_merge(vec.begin(), boundary_it, vec.end());
120template <
typename T,
size_t N>
121inline void array_replace_inline(std::array<T, N>& arr,
const T& v0,
const T& v1)
123 for (
auto j = 0; j < N; j++) {
131template <
typename T,
size_t N>
132inline std::array<T, N> array_replace(
const std::array<T, N>& arr,
const T& v0,
const T& v1)
134 std::array<size_t, 4> out = arr;
135 array_replace_inline(out, v0, v1);