Added some expository information about attribute lists.

This commit is contained in:
Pietro Gagliardi 2016-12-18 14:11:12 -05:00
parent 5c96266c7c
commit 96e15116ba
1 changed files with 9 additions and 0 deletions

View File

@ -1,5 +1,13 @@
// 16 december 2016
/*
An attribute list is a doubly linked list of attributes.
The list is kept sorted in increasing order by start position. Whether or not the sort is stable is undefined, so no temporal information should be expected to stay.
Overlapping attributes are not allowed; if an attribute is added that conflicts with an existing one, the existing one is removed.
In addition, the linked list tries to reduce fragmentation: if an attribute is added that just expands another, then there will only be one entry in alist, not two. (TODO does it really?)
The linked list is not a ring; alist->fist->prev == NULL and alist->last->next == NULL.
*/
struct attr {
uiAttribute type;
uintptr_t val;
@ -235,6 +243,7 @@ void attrlistInsertAt(struct attrlist *alist, uiAttribute type, uintptr_t val, s
// okay so this might conflict; if the val is the same as the one we want, we need to expand the existing attribute, not fragment anything
// TODO this might cause problems with system specific attributes, if we support those; maybe also user-specific?
// TODO will this cause problems with fonts?
// TODO will this reduce fragmentation if we first add from 0 to 2 and then from 2 to 4? or do we have to do that separately?
if (before->val == val) {
attrGrow(alist, a, start, end);
return;