281
305
if (i < pos) detach (ref[i], ref[pos], false);
282
306
else if (i > pos) detach (ref[i], ref[pos], true);
308
if (!is_nil (ref->obs)) ref->obs->done (ref, mod);
284
309
// stretched_print (ref, true, 1);
285
310
// consistency_check ();
314
raw_apply (tree& t, modification mod) {
315
ASSERT (is_applicable (t, mod), "invalid modification");
318
raw_assign (subtree (t, root (mod)), mod->t);
321
raw_insert (subtree (t, root (mod)), index (mod), mod->t);
324
raw_remove (subtree (t, root (mod)), index (mod), argument (mod));
327
raw_split (subtree (t, root (mod)), index (mod), argument (mod));
330
raw_join (subtree (t, root (mod)), index (mod));
332
case MOD_ASSIGN_NODE:
333
raw_assign_node (subtree (t, root (mod)), L (mod));
335
case MOD_INSERT_NODE:
336
raw_insert_node (subtree (t, root (mod)), argument (mod), mod->t);
338
case MOD_REMOVE_NODE:
339
raw_remove_node (subtree (t, root (mod)), index (mod));
344
/******************************************************************************
345
* Wrappers which take into account mirroring
346
******************************************************************************/
348
bool versioning_busy= false;
349
static bool is_busy= false;
350
static list<path> busy_paths;
351
static list<modification> upcoming;
355
for (list<path> l= busy_paths; !is_nil (l); l= l->next)
356
if (l->item <= p) return true;
361
busy_tree (tree& ref) {
362
path ip= obtain_ip (ref);
363
if (ip_attached (ip)) return busy_path (reverse (ip));
368
apply (tree& ref, modification mod) {
369
ASSERT (is_applicable (ref, mod), "invalid modification");
370
path ip= obtain_ip (ref);
371
path p = reverse (ip) * root (mod);
372
if (versioning_busy) raw_apply (ref, mod);
374
if (ip_attached (ip) && !busy_path (p)) {
375
//cout << "Postpone " << (reverse (ip) * mod) << "\n";
376
busy_paths= busy_paths * p;
377
upcoming = upcoming * (reverse (ip) * mod);
381
if (!ip_attached (ip)) raw_apply (ref, mod);
384
busy_paths= list<path> (p);
385
upcoming = list<modification> (reverse (ip) * mod);
386
while (!is_nil (upcoming)) {
387
//cout << "Handle " << upcoming->item << "\n";
388
raw_apply (the_et, upcoming->item);
389
//cout << "Done " << upcoming->item << "\n";
390
upcoming= upcoming->next;
392
busy_paths= list<path> ();
399
assign (tree& ref, tree t) {
400
apply (ref, mod_assign (path (), t));
404
insert (tree& ref, int pos, tree t) {
405
apply (ref, mod_insert (path (), pos, t));
409
remove (tree& ref, int pos, int nr) {
410
apply (ref, mod_remove (path (), pos, nr));
414
split (tree& ref, int pos, int at) {
415
apply (ref, mod_split (path (), pos, at));
419
join (tree& ref, int pos) {
420
apply (ref, mod_join (path (), pos));
424
assign_node (tree& ref, tree_label op) {
425
apply (ref, mod_assign_node (path (), op));
429
insert_node (tree& ref, int pos, tree t) {
430
apply (ref, mod_insert_node (path (), pos, t));
434
remove_node (tree& ref, int pos) {
435
apply (ref, mod_remove_node (path (), pos));
438
/******************************************************************************
439
* Wrappers for trees given by a path
440
******************************************************************************/
443
assign (path p, tree t) {
444
assign (subtree (the_et, p), t);
448
insert (path p, tree ins) {
449
insert (subtree (the_et, path_up (p)), last_item (p), ins);
453
remove (path p, int nr) {
454
remove (subtree (the_et, path_up (p)), last_item (p), nr);
459
tree& st= subtree (the_et, path_up (path_up (p)));
460
int l1= last_item (path_up (p));
461
int l2= last_item (p);
467
join (subtree (the_et, path_up (p)), last_item (p));
471
assign_node (path p, tree_label op) {
472
assign_node (subtree (the_et, p), op);
476
insert_node (path p, tree ins) {
477
insert_node (subtree (the_et, path_up (p)), last_item (p), ins);
481
remove_node (path p) {
482
remove_node (subtree (the_et, path_up (p)), last_item (p));
288
485
/******************************************************************************
289
486
* Default virtual routines
290
487
******************************************************************************/
490
observer_rep::announce (tree& ref, modification mod) {
491
// cout << "Modify: " << mod << "\n";
494
announce_assign (ref, mod->p, mod->t);
497
announce_insert (ref, mod->p, mod->t);
500
announce_remove (ref, path_up (mod->p), last_item (mod->p));
503
announce_split (ref, mod->p);
506
announce_join (ref, mod->p);
508
case MOD_ASSIGN_NODE:
509
announce_assign_node (ref, mod->p, L(mod->t));
511
case MOD_INSERT_NODE:
512
announce_insert_node (ref, mod->p, mod->t);
514
case MOD_REMOVE_NODE:
515
announce_remove_node (ref, mod->p);
521
observer_rep::done (tree& ref, modification mod) {
522
(void) ref; (void) mod;
526
observer_rep::announce_assign (tree& ref, path p, tree t) {
527
(void) ref; (void) p; (void) t;
531
observer_rep::announce_insert (tree& ref, path p, tree ins) {
532
(void) ref; (void) p; (void) ins;
536
observer_rep::announce_remove (tree& ref, path p, int nr) {
537
(void) ref; (void) p; (void) nr;
541
observer_rep::announce_split (tree& ref, path p) {
542
(void) ref; (void) p;
546
observer_rep::announce_join (tree& ref, path p) {
547
(void) ref; (void) p;
551
observer_rep::announce_assign_node (tree& ref, path p, tree_label op) {
552
(void) ref; (void) p; (void) op;
556
observer_rep::announce_insert_node (tree& ref, path p, tree ins) {
557
(void) ref; (void) p; (void) ins;
561
observer_rep::announce_remove_node (tree& ref, path p) {
562
(void) ref; (void) p;
566
observer_rep::notify_assign (tree& ref, tree t) {
567
(void) ref; (void) t;
571
observer_rep::notify_insert (tree& ref, int pos, int nr) {
572
(void) ref; (void) pos; (void) nr;
576
observer_rep::notify_remove (tree& ref, int pos, int nr) {
577
(void) ref; (void) pos; (void) nr;
581
observer_rep::notify_split (tree& ref, int pos, tree prev) {
582
(void) ref; (void) pos; (void) prev;
586
observer_rep::notify_var_split (tree& ref, tree t1, tree t2) {
587
(void) ref; (void) t1; (void) t2;
591
observer_rep::notify_join (tree& ref, int pos, tree next) {
592
(void) ref; (void) pos; (void) next;
596
observer_rep::notify_var_join (tree& ref, tree t, int offset) {
597
(void) ref; (void) t; (void) offset;
601
observer_rep::notify_assign_node (tree& ref, tree_label op) {
602
(void) ref; (void) op;
606
observer_rep::notify_insert_node (tree& ref, int pos) {
607
(void) ref; (void) pos;
611
observer_rep::notify_remove_node (tree& ref, int pos) {
612
(void) ref; (void) pos;
616
observer_rep::notify_detach (tree& ref, tree closest, bool right) {
617
(void) ref; (void) closest; (void) right;
293
621
observer_rep::get_ip (path& ip) {