9 template<
typename T,
typename ShareType =
void>
13 mutable std::unordered_map<T, int>
m_rank;
14 mutable std::conditional_t<!std::is_void_v<ShareType>,
15 std::unordered_map<T, std::optional<ShareType>>,
23 if constexpr (!std::is_void_v<ShareType>) {
35 bool unite(
const T& x,
const T& y) {
39 if (rootX == rootY)
return false;
43 if constexpr (!std::is_void_v<ShareType>) {
50 if constexpr (!std::is_void_v<ShareType>) {
58 if constexpr (!std::is_void_v<ShareType>) {
67 std::unordered_map<T, std::vector<T>>
getGroups()
const {
68 std::unordered_map<T, std::vector<T>> groups;
70 for (
const auto& [element, _] :
m_parent) {
71 T root =
find(element);
72 groups[root].push_back(element);
80 void shared(
const T& x,
const ShareType& data)
81 requires (!std::is_void_v<ShareType>)
87 std::optional<ShareType>
shared(
const T& x)
const
88 requires (!std::is_void_v<ShareType>)
92 return (it !=
m_sharedData.end()) ? it->second : std::nullopt;
bool connected(const T &x, const T &y) const
bool unite(const T &x, const T &y)
std::unordered_map< T, int > m_rank
void shared(const T &x, const ShareType &data)
std::unordered_map< T, T > m_parent
std::unordered_map< T, std::vector< T > > getGroups() const
std::optional< ShareType > shared(const T &x) const
std::conditional_t<!std::is_void_v< ShareType >, std::unordered_map< T, std::optional< ShareType > >, char > m_sharedData