mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-29 19:44:57 +01:00
Stop using std::pair in the implementation of tuples (#479)
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user