251 lines
9.3 KiB
JavaScript
251 lines
9.3 KiB
JavaScript
"use strict";
|
|
var __extends = (this && this.__extends) || (function () {
|
|
var extendStatics = function (d, b) {
|
|
extendStatics = Object.setPrototypeOf ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
return extendStatics(d, b);
|
|
};
|
|
return function (d, b) {
|
|
if (typeof b !== "function" && b !== null)
|
|
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
extendStatics(d, b);
|
|
function __() { this.constructor = d; }
|
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
};
|
|
})();
|
|
var __read = (this && this.__read) || function (o, n) {
|
|
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
if (!m) return o;
|
|
var i = m.call(o), r, ar = [], e;
|
|
try {
|
|
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
}
|
|
catch (error) { e = { error: error }; }
|
|
finally {
|
|
try {
|
|
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
}
|
|
finally { if (e) throw e.error; }
|
|
}
|
|
return ar;
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ListContainer = void 0;
|
|
var Container_1 = require("../../../base/container/Container");
|
|
var ListIterator_1 = require("../../iterator/ListIterator");
|
|
var Repeater_1 = require("../../iterator/disposable/Repeater");
|
|
var NativeArrayIterator_1 = require("../../iterator/disposable/NativeArrayIterator");
|
|
var global_1 = require("../../../iterator/global");
|
|
var ErrorGenerator_1 = require("../../exception/ErrorGenerator");
|
|
/**
|
|
* Basic List Container.
|
|
*
|
|
* @author Jeongho Nam - https://github.com/samchon
|
|
*/
|
|
var ListContainer = /** @class */ (function (_super) {
|
|
__extends(ListContainer, _super);
|
|
/* ---------------------------------------------------------
|
|
CONSTRUCTORS
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* Default Constructor.
|
|
*/
|
|
function ListContainer() {
|
|
var _this = _super.call(this) || this;
|
|
// INIT MEMBERS
|
|
_this.end_ = _this._Create_iterator(null, null);
|
|
_this.clear();
|
|
return _this;
|
|
}
|
|
ListContainer.prototype.assign = function (par1, par2) {
|
|
this.clear();
|
|
this.insert(this.end(), par1, par2);
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.clear = function () {
|
|
// DISCONNECT NODES
|
|
ListIterator_1.ListIterator._Set_prev(this.end_, this.end_);
|
|
ListIterator_1.ListIterator._Set_next(this.end_, this.end_);
|
|
// RE-SIZE -> 0
|
|
this.begin_ = this.end_;
|
|
this.size_ = 0;
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.resize = function (n) {
|
|
var expansion = n - this.size();
|
|
if (expansion > 0)
|
|
this.insert(this.end(), expansion, undefined);
|
|
else if (expansion < 0)
|
|
this.erase((0, global_1.advance)(this.end(), -expansion), this.end());
|
|
};
|
|
/* ---------------------------------------------------------
|
|
ACCESSORS
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.begin = function () {
|
|
return this.begin_;
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.end = function () {
|
|
return this.end_;
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.size = function () {
|
|
return this.size_;
|
|
};
|
|
/* =========================================================
|
|
ELEMENTS I/O
|
|
- PUSH & POP
|
|
- INSERT
|
|
- ERASE
|
|
- POST-PROCESS
|
|
============================================================
|
|
PUSH & POP
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.push_front = function (val) {
|
|
this.insert(this.begin_, val);
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.push_back = function (val) {
|
|
this.insert(this.end_, val);
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.pop_front = function () {
|
|
if (this.empty() === true)
|
|
throw ErrorGenerator_1.ErrorGenerator.empty(this.end_.source().constructor.name, "pop_front");
|
|
this.erase(this.begin_);
|
|
};
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.pop_back = function () {
|
|
if (this.empty() === true)
|
|
throw ErrorGenerator_1.ErrorGenerator.empty(this.end_.source().constructor.name, "pop_back");
|
|
this.erase(this.end_.prev());
|
|
};
|
|
/* ---------------------------------------------------------
|
|
INSERT
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.push = function () {
|
|
var items = [];
|
|
for (var _i = 0; _i < arguments.length; _i++) {
|
|
items[_i] = arguments[_i];
|
|
}
|
|
if (items.length === 0)
|
|
return this.size();
|
|
// INSERT BY RANGE
|
|
var first = new NativeArrayIterator_1.NativeArrayIterator(items, 0);
|
|
var last = new NativeArrayIterator_1.NativeArrayIterator(items, items.length);
|
|
this._Insert_by_range(this.end(), first, last);
|
|
// RETURN SIZE
|
|
return this.size();
|
|
};
|
|
ListContainer.prototype.insert = function (pos) {
|
|
var args = [];
|
|
for (var _i = 1; _i < arguments.length; _i++) {
|
|
args[_i - 1] = arguments[_i];
|
|
}
|
|
// VALIDATION
|
|
if (pos.source() !== this.end_.source())
|
|
throw ErrorGenerator_1.ErrorGenerator.not_my_iterator(this.end_.source(), "insert");
|
|
else if (pos.erased_ === true)
|
|
throw ErrorGenerator_1.ErrorGenerator.erased_iterator(this.end_.source(), "insert");
|
|
// BRANCHES
|
|
if (args.length === 1)
|
|
return this._Insert_by_repeating_val(pos, 1, args[0]);
|
|
else if (args.length === 2 && typeof args[0] === "number")
|
|
return this._Insert_by_repeating_val(pos, args[0], args[1]);
|
|
else
|
|
return this._Insert_by_range(pos, args[0], args[1]);
|
|
};
|
|
ListContainer.prototype._Insert_by_repeating_val = function (position, n, val) {
|
|
var first = new Repeater_1.Repeater(0, val);
|
|
var last = new Repeater_1.Repeater(n);
|
|
return this._Insert_by_range(position, first, last);
|
|
};
|
|
ListContainer.prototype._Insert_by_range = function (position, begin, end) {
|
|
var prev = position.prev();
|
|
var first = null;
|
|
var size = 0;
|
|
for (var it = begin; it.equals(end) === false; it = it.next()) {
|
|
// CONSTRUCT ITEM, THE NEW ELEMENT
|
|
var item = this._Create_iterator(prev, null, it.value);
|
|
if (size === 0)
|
|
first = item;
|
|
// PLACE ITEM ON THE NEXT OF "PREV"
|
|
ListIterator_1.ListIterator._Set_next(prev, item);
|
|
// SHIFT CURRENT ITEM TO PREVIOUS
|
|
prev = item;
|
|
++size;
|
|
}
|
|
// WILL FIRST BE THE BEGIN?
|
|
if (position.equals(this.begin()) === true)
|
|
this.begin_ = first;
|
|
// CONNECT BETWEEN LAST AND POSITION
|
|
ListIterator_1.ListIterator._Set_next(prev, position);
|
|
ListIterator_1.ListIterator._Set_prev(position, prev);
|
|
this.size_ += size;
|
|
return first;
|
|
};
|
|
ListContainer.prototype.erase = function (first, last) {
|
|
if (last === void 0) { last = first.next(); }
|
|
return this._Erase_by_range(first, last);
|
|
};
|
|
ListContainer.prototype._Erase_by_range = function (first, last) {
|
|
// VALIDATION
|
|
if (first.source() !== this.end_.source())
|
|
throw ErrorGenerator_1.ErrorGenerator.not_my_iterator(this.end_.source(), "insert");
|
|
else if (first.erased_ === true)
|
|
throw ErrorGenerator_1.ErrorGenerator.erased_iterator(this.end_.source(), "insert");
|
|
else if (first.equals(this.end_))
|
|
return this.end_;
|
|
// FIND PREV AND NEXT
|
|
var prev = first.prev();
|
|
// SHRINK
|
|
ListIterator_1.ListIterator._Set_next(prev, last);
|
|
ListIterator_1.ListIterator._Set_prev(last, prev);
|
|
for (var it = first; !it.equals(last); it = it.next()) {
|
|
it.erased_ = true;
|
|
--this.size_;
|
|
}
|
|
if (first.equals(this.begin_))
|
|
this.begin_ = last;
|
|
return last;
|
|
};
|
|
/* ---------------------------------------------------------
|
|
SWAP
|
|
--------------------------------------------------------- */
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
ListContainer.prototype.swap = function (obj) {
|
|
var _a, _b, _c;
|
|
_a = __read([obj.begin_, this.begin_], 2), this.begin_ = _a[0], obj.begin_ = _a[1];
|
|
_b = __read([obj.end_, this.end_], 2), this.end_ = _b[0], obj.end_ = _b[1];
|
|
_c = __read([obj.size_, this.size_], 2), this.size_ = _c[0], obj.size_ = _c[1];
|
|
};
|
|
return ListContainer;
|
|
}(Container_1.Container));
|
|
exports.ListContainer = ListContainer;
|
|
//# sourceMappingURL=ListContainer.js.map
|