You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.9 KiB
54 lines
1.9 KiB
'use strict'; |
|
|
|
module.exports = class SymbolTreeNode { |
|
constructor() { |
|
this.parent = null; |
|
this.previousSibling = null; |
|
this.nextSibling = null; |
|
|
|
this.firstChild = null; |
|
this.lastChild = null; |
|
|
|
/** This value is incremented anytime a children is added or removed */ |
|
this.childrenVersion = 0; |
|
/** The last child object which has a cached index */ |
|
this.childIndexCachedUpTo = null; |
|
|
|
/** This value represents the cached node index, as long as |
|
* cachedIndexVersion matches with the childrenVersion of the parent */ |
|
this.cachedIndex = -1; |
|
this.cachedIndexVersion = NaN; // NaN is never equal to anything |
|
} |
|
|
|
get isAttached() { |
|
return Boolean(this.parent || this.previousSibling || this.nextSibling); |
|
} |
|
|
|
get hasChildren() { |
|
return Boolean(this.firstChild); |
|
} |
|
|
|
childrenChanged() { |
|
/* jshint -W016 */ |
|
// integer wrap around |
|
this.childrenVersion = (this.childrenVersion + 1) & 0xFFFFFFFF; |
|
this.childIndexCachedUpTo = null; |
|
} |
|
|
|
getCachedIndex(parentNode) { |
|
// (assumes parentNode is actually the parent) |
|
if (this.cachedIndexVersion !== parentNode.childrenVersion) { |
|
this.cachedIndexVersion = NaN; |
|
// cachedIndex is no longer valid |
|
return -1; |
|
} |
|
|
|
return this.cachedIndex; // -1 if not cached |
|
} |
|
|
|
setCachedIndex(parentNode, index) { |
|
// (assumes parentNode is actually the parent) |
|
this.cachedIndexVersion = parentNode.childrenVersion; |
|
this.cachedIndex = index; |
|
} |
|
};
|
|
|