2
// Copyright (C) 2006-2011 Tobias Sargeant (tobias.sargeant@gmail.com).
3
// All rights reserved.
5
// This file is part of the Carve CSG Library (http://carve-csg.com/)
7
// This file may be used under the terms of the GNU General Public
8
// License version 2.0 as published by the Free Software Foundation
9
// and appearing in the file LICENSE.GPL2 included in the packaging of
12
// This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
13
// INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
14
// A PARTICULAR PURPOSE.
20
#include <carve/carve.hpp>
35
elem(size_t p, size_t r) : parent(p), rank(r) {}
39
std::vector<elem> set;
43
djset() : set(), n_sets(0) {
49
for (size_t i = 0; i < N; ++i) {
50
set.push_back(elem(i,0));
55
if (N == set.size()) {
56
for (size_t i = 0; i < N; ++i) {
62
std::swap(set, temp.set);
63
std::swap(n_sets, temp.n_sets);
67
size_t count() const {
71
size_t find_set_head(size_t a) {
72
if (a == set[a].parent) return a;
75
while (set[a_head].parent != a_head) a_head = set[a_head].parent;
76
set[a].parent = a_head;
80
bool same_set(size_t a, size_t b) {
81
return find_set_head(a) == find_set_head(b);
84
void merge_sets(size_t a, size_t b) {
89
if (set[a].rank < set[b].rank) {
91
} else if (set[b].rank < set[a].rank) {
100
void get_index_to_set(std::vector<size_t> &index_set, std::vector<size_t> &set_size) {
102
index_set.resize(set.size(), n_sets);
104
set_size.resize(n_sets, 0);
107
for (size_t i = 0; i < set.size(); ++i) {
108
size_t s = find_set_head(i);
109
if (index_set[s] == n_sets) index_set[s] = c++;
110
index_set[i] = index_set[s];
111
set_size[index_set[s]]++;
115
template<typename in_iter_t, typename out_collection_t>
116
void collate(in_iter_t in, out_collection_t &out) {
117
std::vector<size_t> set_id(set.size(), n_sets);
121
for (size_t i = 0; i < set.size(); ++i) {
122
size_t s = find_set_head(i);
123
if (set_id[s] == n_sets) set_id[s] = c++;
125
std::insert_iterator<typename out_collection_t::value_type> j(out[s], out[s].end());