From b4838649f527a039da8a52616b7f612ce151ec9b Mon Sep 17 00:00:00 2001 From: krangelov Date: Fri, 3 Sep 2021 21:10:26 +0200 Subject: [PATCH] linear time loading of namespaces --- src/runtime/c/pgf/reader.cxx | 23 +++++++++++++++-------- src/runtime/c/pgf/reader.h | 3 +++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/runtime/c/pgf/reader.cxx b/src/runtime/c/pgf/reader.cxx index b9b8b3e2c..525bee5f0 100644 --- a/src/runtime/c/pgf/reader.cxx +++ b/src/runtime/c/pgf/reader.cxx @@ -147,18 +147,25 @@ object PgfReader::read_text_internal(size_t struct_size) return offs; } +template +Namespace PgfReader::read_namespace(ref (PgfReader::*read_value)(), size_t len) +{ + if (len == 0) + return 0; + + size_t half = len/2; + Namespace left = read_namespace(read_value, half); + ref value = (this->*read_value)(); + Namespace right = read_namespace(read_value, len-half-1); + + return Node::new_node(value, left, right); +} + template Namespace PgfReader::read_namespace(ref (PgfReader::*read_value)()) { size_t len = read_len(); - Namespace nmsp = 0; - for (size_t i = 0; i < len; i++) { - ref value = (this->*read_value)(); - Namespace new_nmsp = namespace_insert(nmsp, value); - namespace_release(nmsp); - nmsp = new_nmsp; - } - return nmsp; + return read_namespace(read_value, len); } template diff --git a/src/runtime/c/pgf/reader.h b/src/runtime/c/pgf/reader.h index d6136cd94..84d763dac 100644 --- a/src/runtime/c/pgf/reader.h +++ b/src/runtime/c/pgf/reader.h @@ -40,6 +40,9 @@ public: return read_text_internal(0); }; + template + Namespace read_namespace(ref (PgfReader::*read_value)(), size_t len); + template Namespace read_namespace(ref (PgfReader::*read_value)());