From: Stefan Monnier <monnier@iro.umontreal.ca>
To: emacs-devel@gnu.org
Subject: Re: Overlays as an AA-tree
Date: Wed, 21 Sep 2016 10:52:23 -0400 [thread overview]
Message-ID: <jwvoa3hgx91.fsf-monnier+gmane.emacs.devel@gnu.org> (raw)
In-Reply-To: 87d1jylv43.fsf@fastmail.com
> What I've been looking at is replacing the current implementation of
> buffer overlays with a self balanced tree. I chose an AA-tree as that
> seemed simple enough for me to grasp :).
Could you describe how you use this tree? An AA-tree is indexed by
a single "number", whereas overlays have two independent "numbers".
So how to use this AA-tree to implement an *interval* tree?
This should be documented in the code. E.g. the "struct Lisp_Overlay"
should define very clearly the meaning of char_start, char_end, left,
and right (i.e. which overlays go to the left, and which go to the
right).
While looking for an answer in the text I found:
/* This function determines where overlays are inserted in the tree.
FIXME: I didn't think too hard about this...
*/
which makes me suspect your design might not be quite right.
Have you read https://en.wikipedia.org/wiki/Interval_tree ?
[ BTW, our convention is to put the "*/" at the end of the last line
rather than alone on the next line. ]
This said, reading overlay_tree_insert_internal, I have the impression
that you're implementing what wikipedia describes as an "Augmented tree"
where the basic tree is your AA-tree, indexed by the left position of
the overlays, with the `max` field being the "augmented" data, which
sounds just fine.
Is that right?
> Anyway, I basically have two questions for you experts:
> 1) Is it worth continuing down this path?
I don't see why not.
> 2) If so, what's the best way to go about something like this? Replacing
> the whole thing at once seems very hard, but I don't really know how to
> go about replacing it little by little.
The only places you absolutely need to replace are all the places that
need to modify the tree. There shouldn't be that many of them
(basically, make-overlay, move-overlay, delete-overlay, plus text
insertion/deletion).
Then the rest can be modified little by little.
Some tricky parts:
- because of the insertion_type, two overlays may start with end1<end2
and finish with end1>end2 without any call to move-overlay.
- the overlay tree needs to be "weak" (i.e. we'll need to add special
code in the GC).
> I'm attaching the diff. It is an unholy mess of ifdefs, but the meat of
> it is in overlays.[ch] and buffer.c. It is a pretty big diff, and it's
> based on master from a few months ago, so I'm not even sure it applies,
I wouldn't worry about merging (better yet: merge from master right away
and then keep doing that on a regular basis, which should be easy since
I don't think we've touched (nor will touch) this code very much).
> Well, the Lisp-visible APIs weren't really the problem. The problem was
> more in the 'internal' handling of overlays in buffer.c and in xdisp.c,
> and also the fact that I had to reimplement a lot of the logic about how
> markers are moved when the buffer changes. Speaking of which, is the
> byte position stored in a marker of any significance in an overlay?
> Otherwise I could at least get rid of those.
AFAIK, the byte-position of markers is used, but the byte-position of
overlays isn't, so you should be able to get rid of them.
Richard said:
> Since overlays have to be discarded whenever text is copied,
> the need to go through the text properties and discard those
> that are really overlays could make things substantially slower.
My original idea was to keep overlays inside the intervals tree, but
that'd be done by adding some fields to the interval struct, so you
wouldn't need to do any extra work to "discard" the overlays when
copying an interval tree: just don't copy the overlay-related fields
while copying the interval tree.
Stefan
next prev parent reply other threads:[~2016-09-21 14:52 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-20 10:32 Overlays as an AA-tree Joakim Jalap
2016-09-20 12:14 ` Clément Pit--Claudel
2016-09-20 12:43 ` Lars Ingebrigtsen
2016-09-20 16:19 ` Joakim Jalap
2016-09-20 23:19 ` Richard Stallman
2016-09-20 14:40 ` Eli Zaretskii
2016-09-20 17:13 ` Joakim Jalap
2016-09-21 16:14 ` Eli Zaretskii
2016-09-22 10:35 ` Joakim Jalap
2016-09-22 12:24 ` Stefan Monnier
2016-09-21 14:52 ` Stefan Monnier [this message]
2016-09-21 15:58 ` Eli Zaretskii
2016-09-21 16:24 ` Stefan Monnier
2016-09-21 16:43 ` Eli Zaretskii
2016-09-21 18:41 ` Stefan Monnier
2016-09-21 19:28 ` Eli Zaretskii
2016-09-22 10:35 ` Joakim Jalap
2016-09-22 12:17 ` Stefan Monnier
2016-09-22 20:11 ` Joakim Jalap
2016-09-23 1:29 ` Stefan Monnier
2016-09-27 6:26 ` Joakim Jalap
2016-09-27 11:50 ` Stefan Monnier
2016-09-27 14:38 ` Eli Zaretskii
2016-09-27 16:07 ` Joakim Jalap
2016-11-21 17:32 ` Clément Pit--Claudel
2016-11-22 8:09 ` Joakim Jalap
2016-11-22 13:44 ` Stefan Monnier
2016-11-23 6:58 ` Joakim Jalap
2016-11-22 13:44 ` Clément Pit--Claudel
2016-11-22 13:55 ` Evgeny Roubinchtein
2016-11-23 7:16 ` Joakim Jalap
2016-11-23 15:42 ` Eli Zaretskii
2016-11-23 16:06 ` Stefan Monnier
2016-11-24 18:33 ` Evgeny Roubinchtein
2016-11-23 7:13 ` Joakim Jalap
2017-02-03 8:49 ` Andreas Politz
2017-02-03 9:13 ` Eli Zaretskii
2017-02-03 10:24 ` Andreas Politz
2017-02-03 11:33 ` Joakim Jalap
2017-02-03 12:44 ` Andreas Politz
2017-02-03 14:11 ` Joakim Jalap
2017-02-03 15:02 ` Andreas Politz
2017-02-03 15:23 ` Joakim Jalap
2017-02-03 15:54 ` Andreas Politz
2017-02-04 21:22 ` Stefan Monnier
2017-02-04 23:10 ` Andreas Politz
2017-02-06 9:56 ` Joakim Jalap
2017-02-06 11:33 ` Andreas Politz
2017-02-06 15:33 ` Joakim Jalap
2017-02-06 15:46 ` Stefan Monnier
2017-02-06 16:52 ` Joakim Jalap
2017-02-06 17:34 ` Stefan Monnier
2017-02-06 17:32 ` Andreas Politz
2017-02-07 12:35 ` Andreas Politz
2017-02-07 14:46 ` Joakim Jalap
2017-02-07 22:00 ` Andreas Politz
2017-02-08 0:36 ` Andreas Politz
2017-02-08 6:53 ` Joakim Jalap
2017-02-08 7:34 ` Andreas Politz
2017-02-08 8:18 ` Joakim Jalap
2017-02-08 8:44 ` Andreas Politz
2017-02-08 16:34 ` Andreas Politz
2017-02-08 17:38 ` Eli Zaretskii
2017-02-08 13:04 ` Stefan Monnier
2017-02-08 22:27 ` Andreas Politz
2017-02-08 22:34 ` Stefan Monnier
2017-02-09 9:34 ` Andreas Politz
2017-02-09 10:05 ` Joakim Jalap
2017-02-09 10:19 ` Andreas Politz
2017-02-13 3:44 ` Andreas Politz
2017-02-13 6:11 ` Eli Zaretskii
2017-02-13 9:04 ` Andreas Politz
2017-02-13 14:36 ` Eli Zaretskii
2017-02-14 10:07 ` Andreas Politz
2017-02-17 4:58 ` Andreas Politz
2017-02-17 7:12 ` Eli Zaretskii
2017-02-19 22:39 ` Andreas Politz
2017-02-19 23:10 ` Stefan Monnier
2017-02-19 23:44 ` Andreas Politz
2017-02-20 15:34 ` Eli Zaretskii
2017-02-21 6:56 ` Andreas Politz
2017-02-21 15:11 ` Stefan Monnier
2017-02-21 18:26 ` Andreas Politz
2017-02-21 19:18 ` Stefan Monnier
2017-02-21 23:36 ` Andreas Politz
2017-02-24 8:43 ` Andreas Politz
2017-04-08 13:28 ` Clément Pit-Claudel
2017-05-03 19:20 ` Andreas Politz
2017-05-03 19:40 ` Stefan Monnier
2017-05-05 20:39 ` Andreas Politz
2017-05-04 0:54 ` Clément Pit-Claudel
2017-05-05 20:10 ` Andreas Politz
2017-05-05 22:22 ` Clément Pit-Claudel
2017-05-06 8:05 ` Andreas Politz
2017-05-04 14:21 ` Eli Zaretskii
2017-05-05 20:08 ` Andreas Politz
2017-05-05 21:41 ` Eli Zaretskii
2017-09-24 13:09 ` Clément Pit-Claudel
2017-10-04 8:17 ` Andreas Politz
2017-10-04 9:22 ` Eli Zaretskii
2017-10-04 20:36 ` Andreas Politz
2017-02-14 0:45 ` Richard Stallman
2017-02-14 8:32 ` Andreas Politz
2017-02-06 13:51 ` Stefan Monnier
2017-02-06 14:26 ` Andreas Politz
2017-02-06 15:06 ` Stefan Monnier
2017-02-06 15:40 ` Joakim Jalap
2017-02-06 16:24 ` Clément Pit-Claudel
2017-02-03 13:55 ` Stefan Monnier
2017-02-03 15:14 ` Andreas Politz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=jwvoa3hgx91.fsf-monnier+gmane.emacs.devel@gnu.org \
--to=monnier@iro.umontreal.ca \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.