[repacker] add graph equality check. Does not compare topological sorting, but looks for equivalence of the two graphs.
diff --git a/src/graph/graph.hh b/src/graph/graph.hh index 0d3dae2..3479e00 100644 --- a/src/graph/graph.hh +++ b/src/graph/graph.hh
@@ -49,6 +49,21 @@ unsigned end = 0; unsigned priority = 0; + bool equals (vertex_t& other, graph_t& graph) + { + if (as_bytes () != other.as_bytes ()) + return false; + + obj.real_links.qsort (); + other.obj.real_links.qsort (); + return links_equal (graph, obj.real_links, other.obj.real_links); + } + + hb_bytes_t as_bytes () + { + return hb_bytes_t (obj.head, table_size ()); + } + friend void swap (vertex_t& a, vertex_t& b) { hb_swap (a.obj, b.obj); @@ -167,6 +182,39 @@ return -table_size; } + + private: + bool links_equal (graph_t& graph, + const hb_vector_t<hb_serialize_context_t::object_t::link_t>& this_links, + const hb_vector_t<hb_serialize_context_t::object_t::link_t>& other_links) const + { + auto a = this_links.iter (); + auto b = other_links.iter (); + + while (a && b) + { + const auto& link_a = *a; + const auto& link_b = *b; + + if (link_a.width != link_b.width || + link_a.is_signed != link_b.is_signed || + link_a.whence != link_b.whence || + link_a.position != link_b.position || + link_a.bias != link_b.bias) + return false; + + if (!graph.vertices_[link_a.objidx].equals (graph.vertices_[link_b.objidx], graph)) + return false; + + a++; + b++; + } + + if (bool (a) != bool (b)) + return false; + + return true; + } }; template <typename T> @@ -233,6 +281,11 @@ hb_free (b); } + bool operator== (graph_t& other) + { + return vertices_[root_idx ()].equals (other.vertices_[other.root_idx ()], *this); + } + bool in_error () const { return !successful ||