54 #include "ling_class/EST_Item.h"
55 #include "ling_class/EST_Relation.h"
56 #include "ling_class/EST_Utterance.h"
58 #include "EST_UList.h"
59 #include "EST_string_aux.h"
61 #include "ling_class_init.h"
66 void EST_Item::class_init(
void)
69 cerr <<
"Calling EST_Item init\n";
72 ling_class_init::use();
74 EST_register_feature_functions(standard);
77 cerr <<
"Finished EST_Item init\n";
89 void EST_Item::copy(
const EST_Item &s)
100 *p_contents = *s.p_contents;
121 if (p != 0) p->n = n;
122 if (u != 0) u->d = n;
126 if (p_relation->p_head ==
this)
127 p_relation->p_head = n;
128 if (p_relation->p_tail ==
this)
129 p_relation->p_tail = p;
133 for (ds=d; ds != 0; ds=nds)
167 set_contents(li->contents());
174 evaluate(
this,p_contents->
f);
177 void EST_Item::unref_contents()
189 void EST_Item::unref_all()
193 p_contents->unref_and_delete();
198 return ((
this == 0) || (p_relation == 0)) ?
207 if (new_contents == 0)
228 int EST_Item::length()
const
232 for (; nn; nn=nn->n,i++);
244 new_node->n = this->n;
245 if (new_node->n != 0)
246 new_node->n->p = new_node;
249 if (p_relation && (p_relation->p_tail ==
this))
250 p_relation->p_tail = new_node;
261 new_node->p = this->p;
262 if (new_node->p != 0)
263 new_node->p->n = new_node;
269 new_node->u = this->u;
270 new_node->u->d = new_node;
274 if (p_relation && (p_relation->p_head ==
this))
275 p_relation->p_head = new_node;
286 new_node->d = this->d;
287 if (new_node->d != 0)
288 new_node->d->u = new_node;
300 new_node->u = this->u;
301 if (new_node->u != 0)
302 new_node->u->d = new_node;
305 if (p_relation && (p_relation->p_head ==
this))
306 p_relation->p_head = new_node;
307 if (p_relation && (p_relation->p_tail ==
this))
308 p_relation->p_tail = new_node;
317 if (
this == 0)
return 0;
320 down()->set_contents(grab_contents());
322 set_contents(si->grab_contents());
334 if (
this == 0)
return 0;
335 for (; node->n != 0; node=node->n);
344 if (
this == 0)
return 0;
345 for (; node->p != 0; node=node->p);
353 if (
this == 0)
return 0;
354 for (; parent(node) != 0; node=parent(node));
358 EST_Item *EST_Item::next_leaf()
const
362 else if (next() != 0)
363 return next()->first_leaf();
365 return parent(
this)->next_leaf();
368 EST_Item *EST_Item::next_item()
const
373 else if (down() != 0)
375 else if (next() != 0)
379 for (
EST_Item *pp = parent(
this); pp != 0; pp = parent(pp))
386 EST_Item *EST_Item::first_leaf()
const
394 return down()->first_leaf();
397 EST_Item *EST_Item::last_leaf()
const
403 return next()->last_leaf();
405 return down()->last_leaf();
412 return root->first_leaf();
419 else if (root->down() == 0)
422 return root->down()->last_leaf();
436 if (in_list(c,p_relation->
head()))
441 if (its_downs) its_downs->u = 0;
444 nnode = insert_below(si);
446 nnode = down()->last()->insert_after(si);
450 its_downs->u = nnode;
451 nnode->d = its_downs;
456 else if (down() == 0)
457 nnode = insert_below(si);
459 nnode = down()->last()->insert_after(si);
475 if (in_list(c,p_relation->
head()))
480 if (its_downs) its_downs->u = 0;
483 nnode = insert_below(si);
485 nnode = down()->insert_before(si);
489 its_downs->u = nnode;
490 nnode->d = its_downs;
495 else if (down() == 0)
496 nnode = insert_below(si);
498 nnode = down()->insert_before(si);
503 EST_Item *EST_Item::grab_daughters()
532 if (from->next() != 0)
533 copy_node_tree(from->next(),to->insert_after(from->next()));
535 if (from->down() != 0)
536 copy_node_tree(from->down(),to->insert_below(from->down()));
545 if (from->next() != 0)
548 copy_node_tree_contents(from->next(),to->insert_after(&i));
551 if (from->down() != 0)
554 copy_node_tree_contents(from->down(),to->insert_below(&i));
559 int EST_Item::verify()
const
566 if (((d == 0) || (d->u ==
this)) &&
567 ((n == 0) || (n->p ==
this)) &&
577 return n->append_daughter(p);
582 return append_daughter(as(n,relname),p);
587 return n->prepend_daughter(p);
592 return prepend_daughter(as(n,relname),p);
595 void remove_item(
EST_Item *l,
const char *relname)
600 if ((lr != 0) && (r != 0))
610 ostream& operator << (ostream &s,
const EST_Item &a)
612 a.features().
save(s);
621 for(p.
begin(f); p; ++p)
622 if (p->v.type() == val_type_featfunc)
624 if (featfunc(p->v) != NULL)
625 p->v = (featfunc(p->v))(a);
628 fprintf(stderr,
"NULL %s function\n", (
const char *) p->k );
629 p->v = EST_Features::feature_default_value;
634 VAL_REGISTER_CLASS_NODEL(item,
EST_Item)