Stop using std::pair in the implementation of tuples (#479)

This commit is contained in:
Geoff Romer
2021-04-26 11:43:06 -07:00
committed by GitHub
parent 3ff01fa60d
commit 1933cfeeeb
10 changed files with 127 additions and 139 deletions
+27 -24
View File
@@ -42,9 +42,9 @@ auto FieldsEqual(VarValues* ts1, VarValues* ts2) -> bool {
auto FindTupleField(const std::string& name, const Value* tuple)
-> std::optional<Address> {
assert(tuple->tag == ValKind::TupleV);
for (const auto& i : *tuple->u.tuple.elts) {
if (i.first == name) {
return i.second;
for (const TupleElement& element : *tuple->u.tuple.elements) {
if (element.name == name) {
return element.address;
}
}
return std::nullopt;
@@ -89,11 +89,10 @@ auto MakeStructVal(const Value* type, const Value* inits) -> const Value* {
return v;
}
auto MakeTupleVal(std::vector<std::pair<std::string, Address>>* elts)
-> const Value* {
auto MakeTupleVal(std::vector<TupleElement>* elements) -> const Value* {
auto* v = new Value();
v->tag = ValKind::TupleV;
v->u.tuple.elts = elts;
v->u.tuple.elements = elements;
return v;
}
@@ -199,7 +198,7 @@ auto MakeStructTypeVal(std::string name, VarValues* fields, VarValues* methods)
auto MakeVoidTypeVal() -> const Value* {
auto* v = new Value();
v->tag = ValKind::TupleV;
v->u.tuple.elts = new std::vector<std::pair<std::string, Address>>();
v->u.tuple.elements = new std::vector<TupleElement>();
return v;
}
@@ -239,16 +238,16 @@ auto PrintValue(const Value* val, std::ostream& out) -> void {
case ValKind::TupleV: {
out << "(";
bool add_commas = false;
for (const auto& elt : *val->u.tuple.elts) {
for (const TupleElement& element : *val->u.tuple.elements) {
if (add_commas) {
out << ", ";
} else {
add_commas = true;
}
out << elt.first << " = ";
state->heap.PrintAddress(elt.second, out);
out << "@" << elt.second;
out << element.name << " = ";
state->heap.PrintAddress(element.address, out);
out << "@" << element.address;
}
out << ")";
break;
@@ -328,15 +327,17 @@ auto TypeEqual(const Value* t1, const Value* t2) -> bool {
case ValKind::ChoiceTV:
return *t1->u.choice_type.name == *t2->u.choice_type.name;
case ValKind::TupleV: {
if (t1->u.tuple.elts->size() != t2->u.tuple.elts->size()) {
if (t1->u.tuple.elements->size() != t2->u.tuple.elements->size()) {
return false;
}
for (size_t i = 0; i < t1->u.tuple.elts->size(); ++i) {
if ((*t1->u.tuple.elts)[i].first != (*t2->u.tuple.elts)[i].first) {
for (size_t i = 0; i < t1->u.tuple.elements->size(); ++i) {
if ((*t1->u.tuple.elements)[i].name !=
(*t2->u.tuple.elements)[i].name) {
return false;
}
if (!TypeEqual(state->heap.Read((*t1->u.tuple.elts)[i].second, 0),
state->heap.Read((*t2->u.tuple.elts)[i].second, 0))) {
if (!TypeEqual(
state->heap.Read((*t1->u.tuple.elements)[i].address, 0),
state->heap.Read((*t2->u.tuple.elements)[i].address, 0))) {
return false;
}
}
@@ -358,20 +359,21 @@ auto TypeEqual(const Value* t1, const Value* t2) -> bool {
// Returns true if all the fields of the two tuples contain equal values
// and returns false otherwise.
static auto FieldsValueEqual(VarAddresses* ts1, VarAddresses* ts2, int line_num)
static auto FieldsValueEqual(std::vector<TupleElement>* ts1,
std::vector<TupleElement>* ts2, int line_num)
-> bool {
if (ts1->size() != ts2->size()) {
return false;
}
for (const auto& [name, address] : *ts1) {
auto iter =
std::find_if(ts2->begin(), ts2->end(),
[name = name](const auto& p) { return p.first == name; });
for (const TupleElement& element : *ts1) {
auto iter = std::find_if(
ts2->begin(), ts2->end(),
[&](const TupleElement& e2) { return e2.name == element.name; });
if (iter == ts2->end()) {
return false;
}
if (!ValueEqual(state->heap.Read(address, line_num),
state->heap.Read(iter->second, line_num), line_num)) {
if (!ValueEqual(state->heap.Read(element.address, line_num),
state->heap.Read(iter->address, line_num), line_num)) {
return false;
}
}
@@ -395,7 +397,8 @@ auto ValueEqual(const Value* v1, const Value* v2, int line_num) -> bool {
case ValKind::FunV:
return v1->u.fun.body == v2->u.fun.body;
case ValKind::TupleV:
return FieldsValueEqual(v1->u.tuple.elts, v2->u.tuple.elts, line_num);
return FieldsValueEqual(v1->u.tuple.elements, v2->u.tuple.elements,
line_num);
default:
case ValKind::VarTV:
case ValKind::IntTV: