38 typename std::map<KEY, Entry>::iterator parent_;
43 typedef typename std::map<KEY, Entry> Map;
44 typedef typename Map::iterator iterator;
48 iterator
find__(
const KEY& key)
const {
49 static const Entry empty;
50 iterator it = entries_.find(key);
52 if (it == entries_.end()) {
53 it = entries_.insert(std::make_pair(key, empty)).first;
54 it->second.parent_ = it;
61 iterator
find_(
const iterator& it)
const {
63 iterator& parent = it->second.parent_;
64 if (parent != it) parent =
find_(parent);
69 inline iterator
find_(
const KEY& key)
const {
70 iterator initial =
find__(key);
71 return find_(initial);
75 typedef std::set<KEY> Set;
81 inline KEY
find(
const KEY& key)
const {
82 iterator root =
find_(key);
87 void merge(
const KEY& x,
const KEY& y) {
89 iterator xRoot =
find_(x);
90 iterator yRoot =
find_(y);
91 if (xRoot == yRoot)
return;
94 if (xRoot->second.rank_ < yRoot->second.rank_)
95 xRoot->second.parent_ = yRoot;
96 else if (xRoot->second.rank_ > yRoot->second.rank_)
97 yRoot->second.parent_ = xRoot;
99 yRoot->second.parent_ = xRoot;
100 xRoot->second.rank_ = xRoot->second.rank_ + 1;
105 std::map<KEY, Set>
sets()
const {
106 std::map<KEY, Set>
sets;
107 iterator it = entries_.begin();
108 for (; it != entries_.end(); it++) {
109 iterator root =
find_(it);
110 sets[root->first].insert(it->first);
119 inline IndexPair(): std::pair<size_t,size_t>(0,0) {}
120 inline IndexPair(
size_t i,
size_t j) : std::pair<size_t,size_t>(i,j) {}
121 inline size_t i()
const {
return first; };
122 inline size_t j()
const {
return second; };
125typedef std::vector<IndexPair> IndexPairVector;
126typedef std::set<IndexPair> IndexPairSet;
128inline IndexPairVector IndexPairSetAsArray(IndexPairSet& set) {
return IndexPairVector(set.begin(), set.end()); }
130typedef std::map<IndexPair, IndexPairSet> IndexPairSetMap;
131typedef DSFMap<IndexPair> DSFMapIndexPair;
Global functions in a separate testing namespace.
Definition: chartTesting.h:28
iterator find__(const KEY &key) const
Given key, find iterator to initial entry.
Definition: DSFMap.h:48
iterator find_(const iterator &it) const
Given iterator to initial entry, find the root Entry.
Definition: DSFMap.h:61
iterator find_(const KEY &key) const
Given key, find the root Entry.
Definition: DSFMap.h:69
std::map< KEY, Set > sets() const
return all sets, i.e. a partition of all elements
Definition: DSFMap.h:105
DSFMap()
constructor
Definition: DSFMap.h:78
KEY find(const KEY &key) const
Given key, find the representative key for the set in which it lives.
Definition: DSFMap.h:81
void merge(const KEY &x, const KEY &y)
Merge two sets.
Definition: DSFMap.h:87
We store the forest in an STL map, but parents are done with pointers.
Definition: DSFMap.h:37
Small utility class for representing a wrappable pairs of ints.
Definition: DSFMap.h:117