提交 cd410cb6 编写于 作者: A Alex Dima

Introduce CharacterClassifier

上级 a86e6b45
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
/**
* A fast character classifier that uses a compact array for ASCII values.
*/
export class CharacterClassifier<T> {
/**
* Maintain a compact (fully initialized ASCII map for quickly classifying ASCII characters - used more often in code).
*/
private _asciiMap: T[];
/**
* The entire map (sparse array).
*/
private _map: T[];
private _defaultValue: T;
constructor(defaultValue:T) {
this._defaultValue = defaultValue;
this._asciiMap = CharacterClassifier._createAsciiMap(defaultValue);
this._map = [];
}
private static _createAsciiMap<T>(defaultValue:T): T[] {
let asciiMap:T[] = [];
for (let i = 0; i < 256; i++) {
asciiMap[i] = defaultValue;
}
return asciiMap;
}
public set(charCode:number, value:T): void {
if (charCode >= 0 && charCode < 256) {
this._asciiMap[charCode] = value;
} else {
this._map[charCode] = value;
}
}
public get(charCode:number): T {
if (charCode >= 0 && charCode < 256) {
return this._asciiMap[charCode];
} else {
return this._map[charCode] || this._defaultValue;
}
}
}
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import {CharacterClassifier} from 'vs/editor/common/core/characterClassifier';
import {CharCode} from 'vs/base/common/charCode';
suite('CharacterClassifier', () => {
test('works', () => {
let classifier = new CharacterClassifier(0);
assert.equal(classifier.get(-1), 0);
assert.equal(classifier.get(0), 0);
assert.equal(classifier.get(CharCode.a), 0);
assert.equal(classifier.get(CharCode.b), 0);
assert.equal(classifier.get(CharCode.z), 0);
assert.equal(classifier.get(255), 0);
assert.equal(classifier.get(1000), 0);
assert.equal(classifier.get(2000), 0);
classifier.set(CharCode.a, 1);
classifier.set(CharCode.z, 2);
classifier.set(1000, 3);
assert.equal(classifier.get(-1), 0);
assert.equal(classifier.get(0), 0);
assert.equal(classifier.get(CharCode.a), 1);
assert.equal(classifier.get(CharCode.b), 0);
assert.equal(classifier.get(CharCode.z), 2);
assert.equal(classifier.get(255), 0);
assert.equal(classifier.get(1000), 3);
assert.equal(classifier.get(2000), 0);
});
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册