From 72e9b2c16cd1bc183226ca0aa8a58a5b1222573d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 1 Apr 2019 16:17:30 -0700 Subject: [PATCH] [serialize] Add add_link() to add link --- src/hb-serialize.hh | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/hb-serialize.hh b/src/hb-serialize.hh index 2b51f0f..e3f8cc0 100644 --- a/src/hb-serialize.hh +++ b/src/hb-serialize.hh @@ -66,7 +66,7 @@ struct hb_serialize_context_t struct link_t { - bool wide: 1; + bool is_wide: 1; unsigned position : 31; objidx_t objidx; }; @@ -196,6 +196,7 @@ struct hb_serialize_context_t objidx = packed.length - 1; + if (0) // XXX packed_map.set (key, objidx); return objidx; @@ -219,8 +220,27 @@ struct hb_serialize_context_t } template - void add_link (T &ofs, objidx_t objidx, const void *base) + void add_link (T &ofs, objidx_t objidx, const void *base = nullptr) { + static_assert (sizeof (T) == 2 || sizeof (T) == 4, ""); + + if (unlikely (!objidx)) + return; + + unsigned i = current.length - 1; + if (!base) + base = current[i].head; + else + { + while (i && base < current[i].head) + i--; + assert (base == current[i].head); + } + + auto& link = *current[i].links.push (); + link.is_wide = sizeof (T) == 4; + link.position = (const char *) &ofs - (const char *) base; + link.objidx = objidx; } void link () @@ -237,7 +257,7 @@ struct hb_serialize_context_t const object_t &child = packed[link.objidx]; unsigned offset = child.head - parent.head; - if (link.wide) + if (link.is_wide) { auto &off = * ((BEInt *) (parent.head + offset)); off = offset; -- 2.7.4