working fullFormLexicon. Slows down loading and compilation

This commit is contained in:
Krasimir Angelov
2022-02-08 16:38:30 +01:00
parent fc7c1249b0
commit 4d240f7260
13 changed files with 581 additions and 195 deletions

View File

@@ -20,7 +20,7 @@ template <class V>
class Node;
template <class V>
using Namespace = ref<Node<V>>;
using Namespace = ref<Node<ref<V>>>;
template <class V>
class PGF_INTERNAL_DECL Node
@@ -29,12 +29,12 @@ public:
size_t ref_count;
size_t sz;
ref<V> value;
V value;
ref<Node> left;
ref<Node> right;
static
ref<Node> new_node(ref<V> value)
ref<Node> new_node(V value)
{
ref<Node> node = current_db->malloc<Node>();
node->ref_count = 1;
@@ -50,11 +50,11 @@ public:
}
static
ref<Node> new_node(ref<V> value, ref<Node> left, ref<Node> right)
ref<Node> new_node(V value, ref<Node> left, ref<Node> right)
{
ref<Node> node = current_db->malloc<Node>();
node->ref_count = 1;
node->sz = 1+namespace_size(left)+namespace_size(right);
node->sz = 1+Node::size(left)+Node::size(right);
node->value = value;
node->left = left;
node->right = right;
@@ -74,8 +74,17 @@ public:
#endif
}
static
void add_value_ref(ref<V> value)
template <class A> static
void add_value_ref(A &value)
{
value.add_ref();
#ifdef DEBUG_NAMESPACE
printf("add_ref value %5ld %s (ref_count=%ld)\n", value.as_object(), value->name.text, value->ref_count);
#endif
}
template <class A> static
void add_value_ref(ref<A> value)
{
value->ref_count++;
#ifdef DEBUG_NAMESPACE
@@ -83,12 +92,34 @@ public:
#endif
}
template <class A> static
void release_value_ref(A &value)
{
#ifdef DEBUG_NAMESPACE
printf("release value %5ld %s (ref_count=%ld)\n", value.as_object(), value->name.text, value->ref_count-1);
#endif
value.release_ref();
}
template <class A> static
void release_value_ref(ref<A> value)
{
#ifdef DEBUG_NAMESPACE
printf("release value %5ld %s (ref_count=%ld)\n", value.as_object(), value->name.text, value->ref_count-1);
#endif
if (!(--value->ref_count)) {
A::release(value);
}
}
static
ref<Node> balanceL(ref<V> value, ref<Node> left, ref<Node> right)
ref<Node> balanceL(V value, ref<Node> left, ref<Node> right)
{
if (right == 0) {
if (left == 0) {
value->ref_count++;
add_value_ref(value);
return new_node(value);
} else {
if (left->left == 0) {
@@ -100,8 +131,8 @@ public:
add_value_ref(value);
add_value_ref(left->value);
add_value_ref(left->right->value);
Namespace<V> new_left = new_node(left->value);
Namespace<V> new_right = new_node(value);
ref<Node<V>> new_left = new_node(left->value);
ref<Node<V>> new_right = new_node(value);
return new_node(left->right->value,
new_left,
new_right);
@@ -109,7 +140,7 @@ public:
} else {
if (left->right == 0) {
add_value_ref(value);
Namespace<V> new_right = new_node(value);
ref<Node<V>> new_right = new_node(value);
add_value_ref(left->value);
add_node_ref(left->left);
return new_node(left->value,
@@ -121,7 +152,7 @@ public:
add_value_ref(left->value);
add_node_ref(left->left);
add_node_ref(left->right);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(value,
left->right,
0);
@@ -137,11 +168,11 @@ public:
add_node_ref(left->right->left);
if (left->right->right != 0)
add_node_ref(left->right->right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(left->value,
left->left,
left->right->left);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(value,
left->right->right,
0);
@@ -165,7 +196,7 @@ public:
add_node_ref(left->left);
add_node_ref(left->right);
add_node_ref(right);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(value,
left->right,
right);
@@ -182,11 +213,11 @@ public:
if (left->right->right != 0)
add_node_ref(left->right->right);
add_node_ref(right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(left->value,
left->left,
left->right->left);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(value,
left->right->right,
right);
@@ -205,7 +236,7 @@ public:
}
static
ref<Node> balanceR(ref<V> value, ref<Node> left, ref<Node> right)
ref<Node> balanceR(V value, ref<Node> left, ref<Node> right)
{
if (left == 0) {
if (right == 0) {
@@ -221,7 +252,7 @@ public:
add_value_ref(value);
add_value_ref(right->value);
add_node_ref(right->right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(value);
return new_node(right->value,
new_left,
@@ -232,9 +263,9 @@ public:
add_value_ref(value);
add_value_ref(right->value);
add_value_ref(right->left->value);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(value);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(right->value);
return new_node(right->left->value,
new_left,
@@ -245,7 +276,7 @@ public:
add_value_ref(right->value);
add_node_ref(right->left);
add_node_ref(right->right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(value,
0,
right->left);
@@ -261,11 +292,11 @@ public:
if (right->left->right != 0)
add_node_ref(right->left->right);
add_node_ref(right->right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(value,
0,
right->left->left);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(right->value,
right->left->right,
right->right);
@@ -289,7 +320,7 @@ public:
add_node_ref(left);
add_node_ref(right->left);
add_node_ref(right->right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(value,
left,
right->left);
@@ -306,11 +337,11 @@ public:
if (right->left->right != 0)
add_node_ref(right->left->right);
add_node_ref(right->right);
Namespace<V> new_left =
ref<Node<V>> new_left =
new_node(value,
left,
right->left->left);
Namespace<V> new_right =
ref<Node<V>> new_right =
new_node(right->value,
right->left->right,
right->right);
@@ -327,6 +358,68 @@ public:
}
}
}
static
size_t size(ref<Node> node)
{
if (node == 0)
return 0;
return node->sz;
}
static
ref<Node> pop_first(ref<Node> node, V *res)
{
if (node == 0) {
return 0;
} else if (node->left == 0) {
*res = node->value;
if (node->right != 0)
node->right->ref_count++;
return node->right;
} else {
ref<Node> new_left = pop_first(node->left, res);
ref<Node> new_node = balanceR(node->value, new_left, node->right);
release(new_left);
return new_node;
}
}
static
ref<Node> pop_last(ref<Node> node, V *res)
{
if (node == 0) {
return 0;
} else if (node->right == 0) {
*res = node->value;
if (node->left != 0)
node->left->ref_count++;
return node->left;
} else {
ref<Node> new_right = pop_last(node->right, res);
ref<Node> new_node = balanceR(node->value, node->left, new_right);
release(new_right);
return new_node;
}
}
static
void release(ref<Node> node)
{
if (node == 0)
return;
#ifdef DEBUG_NAMESPACE
printf("release node %6ld %s (ref_count=%ld)\n", node.as_object(), node->value->name.text, node->ref_count-1);
#endif
if (!(--node->ref_count)) {
release(node->left);
release(node->right);
release_value_ref(node->value);
PgfDB::free(node);
}
}
};
template <class V>
@@ -345,17 +438,17 @@ template <class V>
Namespace<V> namespace_insert(Namespace<V> map, ref<V> value)
{
if (map == 0)
return Node<V>::new_node(value);
return Node<ref<V>>::new_node(value);
int cmp = textcmp(&value->name,&map->value->name);
if (cmp < 0) {
Namespace<V> left = namespace_insert(map->left, value);
Namespace<V> node = Node<V>::balanceL(map->value,left,map->right);
Namespace<V> node = Node<ref<V>>::balanceL(map->value,left,map->right);
namespace_release(left);
return node;
} else if (cmp > 0) {
Namespace<V> right = namespace_insert(map->right, value);
Namespace<V> node = Node<V>::balanceR(map->value, map->left, right);
Namespace<V> node = Node<ref<V>>::balanceR(map->value, map->left, right);
namespace_release(right);
return node;
} else {
@@ -363,32 +456,37 @@ Namespace<V> namespace_insert(Namespace<V> map, ref<V> value)
map->left->ref_count++;
if (map->right != 0)
map->right->ref_count++;
return Node<V>::new_node(value,map->left,map->right);
return Node<ref<V>>::new_node(value,map->left,map->right);
}
}
template <class V>
Namespace<V> namespace_delete(Namespace<V> map, PgfText* name)
Namespace<V> namespace_delete(Namespace<V> map, PgfText* name,
ref<V> *pvalue = NULL)
{
if (map == 0)
if (map == 0) {
if (pvalue != NULL) *pvalue = 0;
return 0;
}
int cmp = textcmp(name,&map->value->name);
if (cmp < 0) {
Namespace<V> left = namespace_delete(map->left, name);
Namespace<V> left = namespace_delete(map->left, name, pvalue);
if (left == map->left)
return map;
Namespace<V> node = Node<V>::balanceR(map->value,left,map->right);
Namespace<V> node = Node<ref<V>>::balanceR(map->value,left,map->right);
namespace_release(left);
return node;
} else if (cmp > 0) {
Namespace<V> right = namespace_delete(map->right, name);
Namespace<V> right = namespace_delete(map->right, name, pvalue);
if (right == map->right)
return map;
Namespace<V> node = Node<V>::balanceL(map->value,map->left,right);
Namespace<V> node = Node<ref<V>>::balanceL(map->value,map->left,right);
namespace_release(right);
return node;
} else {
if (pvalue != NULL) *pvalue = map->value;
if (map->left == 0) {
if (map->right != 0)
map->right->ref_count++;
@@ -399,54 +497,20 @@ Namespace<V> namespace_delete(Namespace<V> map, PgfText* name)
return map->left;
} else if (map->left->sz > map->right->sz) {
ref<V> value;
Namespace<V> new_left = namespace_pop_last(map->left, &value);
Namespace<V> node = Node<V>::balanceR(value, new_left, map->right);
Namespace<V> new_left = Node<ref<V>>::pop_last(map->left, &value);
Namespace<V> node = Node<ref<V>>::balanceR(value, new_left, map->right);
namespace_release(new_left);
return node;
} else {
ref<V> value;
Namespace<V> new_right = namespace_pop_first(map->right, &value);
Namespace<V> node = Node<V>::balanceL(value, map->left, new_right);
Namespace<V> new_right = Node<ref<V>>::pop_first(map->right, &value);
Namespace<V> node = Node<ref<V>>::balanceL(value, map->left, new_right);
namespace_release(new_right);
return node;
}
}
}
template <class V>
Namespace<V> namespace_pop_first(Namespace<V> map, ref<V> *res)
{
if (map == 0) {
return 0;
} else if (map->left == 0) {
*res = map->value;
if (map->right != 0)
map->right->ref_count++;
return map->right;
} else {
Namespace<V> new_left = namespace_pop_first(map->left, res);
Namespace<V> node = Node<V>::balanceR(map->value, new_left, map->right);
namespace_release(new_left);
return node;
}
}
template <class V>
Namespace<V> namespace_pop_last(Namespace<V> map, ref<V> *res)
{
if (map == 0) {
return 0;
} else if (map->right == 0) {
*res = map->value;
if (map->left != 0)
map->left->ref_count++;
return map->left;
} else {
Namespace<V> new_right = namespace_pop_last(map->right, res);
return Node<V>::balanceR(map->value, map->left, new_right);
}
}
template <class V>
ref<V> namespace_lookup(Namespace<V> map, PgfText *name)
{
@@ -465,9 +529,7 @@ ref<V> namespace_lookup(Namespace<V> map, PgfText *name)
template <class V>
size_t namespace_size(Namespace<V> map)
{
if (map == 0)
return 0;
return map->sz;
return Node<ref<V>>::size(map);
}
template <class V>
@@ -492,27 +554,7 @@ void namespace_iter(Namespace<V> map, PgfItor* itor, PgfExn *err)
template <class V>
void namespace_release(Namespace<V> node)
{
if (node == 0)
return;
#ifdef DEBUG_NAMESPACE
printf("release node %6ld %s (ref_count=%ld)\n", node.as_object(), node->value->name.text, node->ref_count-1);
#endif
if (!(--node->ref_count)) {
namespace_release(node->left);
namespace_release(node->right);
#ifdef DEBUG_NAMESPACE
printf("release value %5ld %s (ref_count=%ld)\n", node->value.as_object(), node->value->name.text, node->value->ref_count-1);
#endif
if (!(--node->value->ref_count)) {
V::release(node->value);
}
PgfDB::free(node);
}
Node<ref<V>>::release(node);
}
#endif