mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -06:00
linear time loading of namespaces
This commit is contained in:
@@ -147,18 +147,25 @@ object PgfReader::read_text_internal(size_t struct_size)
|
|||||||
return offs;
|
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>
|
template<class V>
|
||||||
Namespace<V> PgfReader::read_namespace(ref<V> (PgfReader::*read_value)())
|
Namespace<V> PgfReader::read_namespace(ref<V> (PgfReader::*read_value)())
|
||||||
{
|
{
|
||||||
size_t len = read_len();
|
size_t len = read_len();
|
||||||
Namespace<V> nmsp = 0;
|
return read_namespace(read_value, len);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class C, class V>
|
template <class C, class V>
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ public:
|
|||||||
return read_text_internal(0);
|
return read_text_internal(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class V>
|
||||||
|
Namespace<V> read_namespace(ref<V> (PgfReader::*read_value)(), size_t len);
|
||||||
|
|
||||||
template<class V>
|
template<class V>
|
||||||
Namespace<V> read_namespace(ref<V> (PgfReader::*read_value)());
|
Namespace<V> read_namespace(ref<V> (PgfReader::*read_value)());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user