1
0
forked from GitHub/gf-core

linear time loading of namespaces

This commit is contained in:
krangelov
2021-09-03 21:10:26 +02:00
parent 2e0c93c594
commit b4838649f5
2 changed files with 18 additions and 8 deletions

View File

@@ -147,18 +147,25 @@ object PgfReader::read_text_internal(size_t struct_size)
return offs;
}
template<class V>
Namespace<V> PgfReader::read_namespace(ref<V> (PgfReader::*read_value)(), size_t len)
{
if (len == 0)
return 0;
size_t half = len/2;
Namespace<V> left = read_namespace(read_value, half);
ref<V> value = (this->*read_value)();
Namespace<V> right = read_namespace(read_value, len-half-1);
return Node<V>::new_node(value, left, right);
}
template<class V>
Namespace<V> PgfReader::read_namespace(ref<V> (PgfReader::*read_value)())
{
size_t len = read_len();
Namespace<V> nmsp = 0;
for (size_t i = 0; i < len; i++) {
ref<V> value = (this->*read_value)();
Namespace<V> new_nmsp = namespace_insert(nmsp, value);
namespace_release(nmsp);
nmsp = new_nmsp;
}
return nmsp;
return read_namespace(read_value, len);
}
template <class C, class V>

View File

@@ -40,6 +40,9 @@ public:
return read_text_internal(0);
};
template<class V>
Namespace<V> read_namespace(ref<V> (PgfReader::*read_value)(), size_t len);
template<class V>
Namespace<V> read_namespace(ref<V> (PgfReader::*read_value)());