-
Notifications
You must be signed in to change notification settings - Fork 0
/
link.cc
83 lines (61 loc) · 2.09 KB
/
link.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
* Copyright CERN 2016
* @author Maciej Suminski ([email protected])
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "link.h"
#include "variable.h"
#include "options.h"
#include <iomanip>
#include <sstream>
using namespace std;
Link::Link(Variable*first, Variable*second)
: first_(first), second_(second) {
assert(first && second);
assert(first_->size() == second_->size());
}
bool Link::compare() const {
return ((first_->hash() == second_->hash())
&& (compare_states || first_->prev_hash() == second_->prev_hash()));
}
size_t Link::hash() const {
size_t first = first_->hash() ^ first_->prev_hash();
size_t second = second_->hash() ^ first_->prev_hash();
return (first + 1) * (second + 1);
}
ostream&operator<<(ostream&out, const Link&link) {
stringstream s1, s2;
const Variable*var1 = link.first();
const Variable*var2 = link.second();
s1 << *var1;
s2 << *var2;
// Align scope names
int len1 = s1.str().length();
int len2 = s2.str().length();
if(len1 > len2) {
s2 << setw(len1 - len2) << " ";
} else if(len2 > len1) {
s1 << setw(len2 - len1) << " ";
}
s1 << "\t= ";
s2 << "\t= ";
if(!compare_states && var1->changed())
s1 << var1->prev_value_str() << " -> ";
s1 << var1->value_str();
if(!compare_states && var2->changed())
s2 << var2->prev_value_str() << " -> ";
s2 << var2->value_str();
out << s1.str() << endl;
out << s2.str() << endl;
return out;
}