js-sdsl
Version:
javascript standard data structure library which benchmark against C++ STL
338 lines (327 loc) • 7.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "t", {
value: true
});
exports.default = void 0;
var _Base = _interopRequireDefault(require("./Base"));
var _ContainerBase = require("../ContainerBase");
var _throwError = require("../../utils/throwError");
function _interopRequireDefault(t) {
return t && t.t ? t : {
default: t
};
}
class LinkListIterator extends _ContainerBase.ContainerIterator {
constructor(t, i, s, r) {
super(r);
this.o = t;
this.h = i;
this.container = s;
if (this.iteratorType === 0) {
this.pre = function() {
if (this.o.L === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
this.o = this.o.L;
return this;
};
this.next = function() {
if (this.o === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
this.o = this.o.B;
return this;
};
} else {
this.pre = function() {
if (this.o.B === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
this.o = this.o.B;
return this;
};
this.next = function() {
if (this.o === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
this.o = this.o.L;
return this;
};
}
}
get pointer() {
if (this.o === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
return this.o.l;
}
set pointer(t) {
if (this.o === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
this.o.l = t;
}
copy() {
return new LinkListIterator(this.o, this.h, this.container, this.iteratorType);
}
isAccessible() {
return this.o !== this.h;
}
}
class LinkList extends _Base.default {
constructor(t = []) {
super();
this.h = {};
this.p = this._ = this.h.L = this.h.B = this.h;
const i = this;
t.forEach((function(t) {
i.pushBack(t);
}));
}
V(t) {
const {L: i, B: s} = t;
i.B = s;
s.L = i;
if (t === this.p) {
this.p = s;
}
if (t === this._) {
this._ = i;
}
this.i -= 1;
}
G(t, i) {
const s = i.B;
const r = {
l: t,
L: i,
B: s
};
i.B = r;
s.L = r;
if (i === this.h) {
this.p = r;
}
if (s === this.h) {
this._ = r;
}
this.i += 1;
}
clear() {
this.i = 0;
this.p = this._ = this.h.L = this.h.B = this.h;
}
begin() {
return new LinkListIterator(this.p, this.h, this);
}
end() {
return new LinkListIterator(this.h, this.h, this);
}
rBegin() {
return new LinkListIterator(this._, this.h, this, 1);
}
rEnd() {
return new LinkListIterator(this.h, this.h, this, 1);
}
front() {
return this.p.l;
}
back() {
return this._.l;
}
getElementByPos(t) {
if (t < 0 || t > this.i - 1) {
throw new RangeError;
}
let i = this.p;
while (t--) {
i = i.B;
}
return i.l;
}
eraseElementByPos(t) {
if (t < 0 || t > this.i - 1) {
throw new RangeError;
}
let i = this.p;
while (t--) {
i = i.B;
}
this.V(i);
return this.i;
}
eraseElementByValue(t) {
let i = this.p;
while (i !== this.h) {
if (i.l === t) {
this.V(i);
}
i = i.B;
}
return this.i;
}
eraseElementByIterator(t) {
const i = t.o;
if (i === this.h) {
(0, _throwError.throwIteratorAccessError)();
}
t = t.next();
this.V(i);
return t;
}
pushBack(t) {
this.G(t, this._);
return this.i;
}
popBack() {
if (this.i === 0) return;
const t = this._.l;
this.V(this._);
return t;
}
pushFront(t) {
this.G(t, this.h);
return this.i;
}
popFront() {
if (this.i === 0) return;
const t = this.p.l;
this.V(this.p);
return t;
}
setElementByPos(t, i) {
if (t < 0 || t > this.i - 1) {
throw new RangeError;
}
let s = this.p;
while (t--) {
s = s.B;
}
s.l = i;
}
insert(t, i, s = 1) {
if (t < 0 || t > this.i) {
throw new RangeError;
}
if (s <= 0) return this.i;
if (t === 0) {
while (s--) this.pushFront(i);
} else if (t === this.i) {
while (s--) this.pushBack(i);
} else {
let r = this.p;
for (let i = 1; i < t; ++i) {
r = r.B;
}
const e = r.B;
this.i += s;
while (s--) {
r.B = {
l: i,
L: r
};
r.B.L = r;
r = r.B;
}
r.B = e;
e.L = r;
}
return this.i;
}
find(t) {
let i = this.p;
while (i !== this.h) {
if (i.l === t) {
return new LinkListIterator(i, this.h, this);
}
i = i.B;
}
return this.end();
}
reverse() {
if (this.i <= 1) {
return this;
}
let t = this.p;
let i = this._;
let s = 0;
while (s << 1 < this.i) {
const r = t.l;
t.l = i.l;
i.l = r;
t = t.B;
i = i.L;
s += 1;
}
return this;
}
unique() {
if (this.i <= 1) {
return this.i;
}
let t = this.p;
while (t !== this.h) {
let i = t;
while (i.B !== this.h && i.l === i.B.l) {
i = i.B;
this.i -= 1;
}
t.B = i.B;
t.B.L = t;
t = t.B;
}
return this.i;
}
sort(t) {
if (this.i <= 1) {
return this;
}
const i = [];
this.forEach((function(t) {
i.push(t);
}));
i.sort(t);
let s = this.p;
i.forEach((function(t) {
s.l = t;
s = s.B;
}));
return this;
}
merge(t) {
const i = this;
if (this.i === 0) {
t.forEach((function(t) {
i.pushBack(t);
}));
} else {
let s = this.p;
t.forEach((function(t) {
while (s !== i.h && s.l <= t) {
s = s.B;
}
i.G(t, s.L);
}));
}
return this.i;
}
forEach(t) {
let i = this.p;
let s = 0;
while (i !== this.h) {
t(i.l, s++, this);
i = i.B;
}
}
* [Symbol.iterator]() {
if (this.i === 0) return;
let t = this.p;
while (t !== this.h) {
yield t.l;
t = t.B;
}
}
}
var _default = LinkList;
exports.default = _default;
//# sourceMappingURL=LinkList.js.map