1#ifndef ALGORITHMS_EQUIVALENCE_RELATION_H
2#define ALGORITHMS_EQUIVALENCE_RELATION_H
7#include <unordered_map>
10namespace equivalence_relation {
12class EquivalenceRelation;
14using ElementListIter = std::list<int>::iterator;
15using ElementListConstIter = std::list<int>::const_iterator;
16using BlockListIter = std::list<Block>::iterator;
17using BlockListConstIter = std::list<Block>::const_iterator;
20 std::list<int> elements;
28 friend class EquivalenceRelation;
29 BlockListIter it_intersection_block;
32 bool empty()
const {
return elements.empty(); }
34 ElementListIter insert(
int element)
36 return elements.insert(elements.end(), element);
39 void erase(ElementListIter it) { elements.erase(it); }
41 ElementListIter begin() {
return elements.begin(); }
43 ElementListIter end() {
return elements.end(); }
45 ElementListConstIter begin()
const {
return elements.begin(); }
47 ElementListConstIter end()
const {
return elements.end(); }
50class EquivalenceRelation {
51 std::list<Block> blocks;
58 using ElementPosition = std::pair<BlockListIter, ElementListIter>;
59 using ElementPositionMap = std::unordered_map<int, ElementPosition>;
60 ElementPositionMap element_positions;
62 BlockListIter add_empty_block();
65 explicit EquivalenceRelation(
const std::vector<int>& elements);
67 BlockListConstIter begin()
const {
return blocks.begin(); }
68 BlockListConstIter end()
const {
return blocks.end(); }
77 void refine(
const std::vector<int>& block);