diff options
Diffstat (limited to 'src/network_set.cpp')
| -rw-r--r-- | src/network_set.cpp | 58 |
1 files changed, 10 insertions, 48 deletions
| diff --git a/src/network_set.cpp b/src/network_set.cpp index 3238dcd..6d2a098 100644 --- a/src/network_set.cpp +++ b/src/network_set.cpp | |||
| @@ -1,68 +1,30 @@ | |||
| 1 | #include "network_set.h" | 1 | #include "network_set.h" |
| 2 | 2 | ||
| 3 | void NetworkSet::Clear() { | 3 | void NetworkSet::Clear() { |
| 4 | networks_.clear(); | ||
| 5 | network_by_item_.clear(); | 4 | network_by_item_.clear(); |
| 6 | } | 5 | } |
| 7 | 6 | ||
| 8 | int NetworkSet::AddLink(int id1, int id2) { | 7 | void NetworkSet::AddLink(int id1, int id2) { |
| 9 | if (id2 > id1) { | 8 | if (id2 > id1) { |
| 10 | // Make sure id1 < id2 | 9 | // Make sure id1 < id2 |
| 11 | std::swap(id1, id2); | 10 | std::swap(id1, id2); |
| 12 | } | 11 | } |
| 13 | 12 | ||
| 14 | if (network_by_item_.count(id1)) { | 13 | if (!network_by_item_.count(id1)) { |
| 15 | if (network_by_item_.count(id2)) { | 14 | network_by_item_[id1] = {}; |
| 16 | int network_id1 = network_by_item_[id1]; | ||
| 17 | int network_id2 = network_by_item_[id2]; | ||
| 18 | |||
| 19 | networks_[network_id1].emplace(id1, id2); | ||
| 20 | |||
| 21 | if (network_id1 != network_id2) { | ||
| 22 | for (const auto& [other_id1, other_id2] : networks_[network_id2]) { | ||
| 23 | network_by_item_[other_id1] = network_id1; | ||
| 24 | network_by_item_[other_id2] = network_id1; | ||
| 25 | } | ||
| 26 | |||
| 27 | networks_[network_id1].merge(networks_[network_id2]); | ||
| 28 | networks_[network_id2].clear(); | ||
| 29 | } | ||
| 30 | |||
| 31 | return network_id1; | ||
| 32 | } else { | ||
| 33 | int network_id = network_by_item_[id1]; | ||
| 34 | network_by_item_[id2] = network_id; | ||
| 35 | networks_[network_id].emplace(id1, id2); | ||
| 36 | |||
| 37 | return network_id; | ||
| 38 | } | ||
| 39 | } else { | ||
| 40 | if (network_by_item_.count(id2)) { | ||
| 41 | int network_id = network_by_item_[id2]; | ||
| 42 | network_by_item_[id1] = network_id; | ||
| 43 | networks_[network_id].emplace(id1, id2); | ||
| 44 | |||
| 45 | return network_id; | ||
| 46 | } else { | ||
| 47 | int network_id = networks_.size(); | ||
| 48 | network_by_item_[id1] = network_id; | ||
| 49 | network_by_item_[id2] = network_id; | ||
| 50 | networks_.emplace_back(); | ||
| 51 | networks_[network_id] = {{id1, id2}}; | ||
| 52 | |||
| 53 | return network_id; | ||
| 54 | } | ||
| 55 | } | 15 | } |
| 16 | if (!network_by_item_.count(id2)) { | ||
| 17 | network_by_item_[id2] = {}; | ||
| 18 | } | ||
| 19 | |||
| 20 | network_by_item_[id1].insert({id1, id2}); | ||
| 21 | network_by_item_[id2].insert({id1, id2}); | ||
| 56 | } | 22 | } |
| 57 | 23 | ||
| 58 | bool NetworkSet::IsItemInNetwork(int id) const { | 24 | bool NetworkSet::IsItemInNetwork(int id) const { |
| 59 | return network_by_item_.count(id); | 25 | return network_by_item_.count(id); |
| 60 | } | 26 | } |
| 61 | 27 | ||
| 62 | int NetworkSet::GetNetworkWithItem(int id) const { | ||
| 63 | return network_by_item_.at(id); | ||
| 64 | } | ||
| 65 | |||
| 66 | const std::set<std::pair<int, int>>& NetworkSet::GetNetworkGraph(int id) const { | 28 | const std::set<std::pair<int, int>>& NetworkSet::GetNetworkGraph(int id) const { |
| 67 | return networks_.at(id); | 29 | return network_by_item_.at(id); |
| 68 | } | 30 | } |
