124 lines
2.3 KiB
JavaScript
124 lines
2.3 KiB
JavaScript
const MIN_INT32 = -2147483648;
|
|
const MAX_INT32 = 2147483647;
|
|
|
|
export default class SortKey {
|
|
constructor(buffer) {
|
|
if (buffer) {
|
|
this._keys = new Int32Array(buffer, 2);
|
|
} else {
|
|
this._keys = new Int32Array(2);
|
|
}
|
|
}
|
|
|
|
get gapKey() {
|
|
return this._keys[0];
|
|
}
|
|
|
|
set gapKey(value) {
|
|
this._keys[0] = value;
|
|
}
|
|
|
|
get eventKey() {
|
|
return this._keys[1];
|
|
}
|
|
|
|
set eventKey(value) {
|
|
this._keys[1] = value;
|
|
}
|
|
|
|
get buffer() {
|
|
return this._keys.buffer;
|
|
}
|
|
|
|
nextKeyWithGap() {
|
|
const k = new SortKey();
|
|
k.gapKey = this.gapKey + 1;
|
|
k.eventKey = 0;
|
|
return k;
|
|
}
|
|
|
|
nextKey() {
|
|
const k = new SortKey();
|
|
k.gapKey = this.gapKey;
|
|
k.eventKey = this.eventKey + 1;
|
|
return k;
|
|
}
|
|
|
|
previousKey() {
|
|
const k = new SortKey();
|
|
k.gapKey = this.gapKey;
|
|
k.eventKey = this.eventKey - 1;
|
|
return k;
|
|
}
|
|
|
|
clone() {
|
|
const k = new SortKey();
|
|
k.gapKey = this.gapKey;
|
|
k.eventKey = this.eventKey;
|
|
return k;
|
|
}
|
|
|
|
static get maxKey() {
|
|
const maxKey = new SortKey();
|
|
maxKey.gapKey = MAX_INT32;
|
|
maxKey.eventKey = MAX_INT32;
|
|
return maxKey;
|
|
}
|
|
|
|
static get minKey() {
|
|
const minKey = new SortKey();
|
|
minKey.gapKey = MIN_INT32;
|
|
minKey.eventKey = MIN_INT32;
|
|
return minKey;
|
|
}
|
|
|
|
toString() {
|
|
return `[${this.gapKey}/${this.eventKey}]`;
|
|
}
|
|
}
|
|
|
|
//#ifdef TESTS
|
|
export function tests() {
|
|
return {
|
|
test_default_key(assert) {
|
|
const k = new SortKey();
|
|
assert.equal(k.gapKey, 0);
|
|
assert.equal(k.eventKey, 0);
|
|
},
|
|
|
|
test_inc(assert) {
|
|
const a = new SortKey();
|
|
const b = a.nextKey();
|
|
assert.equal(a.gapKey, b.gapKey);
|
|
assert.equal(a.eventKey + 1, b.eventKey);
|
|
const c = b.previousKey();
|
|
assert.equal(b.gapKey, c.gapKey);
|
|
assert.equal(c.eventKey + 1, b.eventKey);
|
|
assert.equal(a.eventKey, c.eventKey);
|
|
},
|
|
|
|
test_min_key(assert) {
|
|
const minKey = SortKey.minKey;
|
|
const k = new SortKey();
|
|
assert(minKey.gapKey < k.gapKey);
|
|
assert(minKey.eventKey < k.eventKey);
|
|
},
|
|
|
|
test_max_key(assert) {
|
|
const maxKey = SortKey.maxKey;
|
|
const k = new SortKey();
|
|
assert(maxKey.gapKey > k.gapKey);
|
|
assert(maxKey.eventKey > k.eventKey);
|
|
},
|
|
|
|
test_immutable(assert) {
|
|
const a = new SortKey();
|
|
const gapKey = a.gapKey;
|
|
const eventKey = a.gapKey;
|
|
a.nextKeyWithGap();
|
|
assert.equal(a.gapKey, gapKey);
|
|
assert.equal(a.eventKey, eventKey);
|
|
}
|
|
};
|
|
}
|
|
//#endif
|