From 18891f5bae98ad1b86649eeab82f683b2f92aed9 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Sat, 23 Sep 2017 14:58:10 +0200 Subject: [PATCH] Pooled string column --- src/reader/common/column.ts | 3 ++- src/reader/common/text/column/fixed.ts | 7 +++++++ src/reader/gro/parser.ts | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/reader/common/column.ts b/src/reader/common/column.ts index 6a2cd768b..2d4f086f8 100644 --- a/src/reader/common/column.ts +++ b/src/reader/common/column.ts @@ -5,10 +5,11 @@ */ export type ArrayType = string[] | number[] | Float32Array | Float64Array | Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array -export type ColumnType = typeof ColumnType.str | typeof ColumnType.int | typeof ColumnType.float +export type ColumnType = typeof ColumnType.str | typeof ColumnType.pooledStr | typeof ColumnType.int | typeof ColumnType.float export namespace ColumnType { export const str = { '@type': '' as string, kind: 'str' as 'str' }; + export const pooledStr = { '@type': '' as string, kind: 'pooled-str' as 'pooled-str' }; export const int = { '@type': 0 as number, kind: 'int' as 'int' }; export const float = { '@type': 0 as number, kind: 'float' as 'float' }; } diff --git a/src/reader/common/text/column/fixed.ts b/src/reader/common/text/column/fixed.ts index e7df1e074..48a8db73b 100644 --- a/src/reader/common/text/column/fixed.ts +++ b/src/reader/common/text/column/fixed.ts @@ -7,6 +7,7 @@ import { Column, ColumnType, createArray } from '../../column' import { trimStr } from '../tokenizer' import { parseIntSkipLeadingWhitespace, parseFloatSkipLeadingWhitespace } from '../number-parser' +import StringPool from '../../../../utils/short-string-pool' export interface FixedColumnInfo { data: string, @@ -28,12 +29,18 @@ function getArrayValues(value: (row: number) => any, target: any[], start: numbe export function FixedColumn<T extends ColumnType>(info: FixedColumnInfo, offset: number, width: number, type: T): Column<T['@type']> { const { data, lines, rowCount } = info; const { kind } = type; + const pool = kind === 'pooled-str' ? StringPool.create() : void 0; const value: Column<T['@type']>['value'] = kind === 'str' ? row => { let s = lines[2 * row] + offset, e = s + width, le = lines[2 * row + 1]; if (s >= le) return ''; if (e > le) e = le; return trimStr(data, s, e); + } : kind === 'pooled-str' ? row => { + let s = lines[2 * row] + offset, e = s + width, le = lines[2 * row + 1]; + if (s >= le) return ''; + if (e > le) e = le; + return StringPool.get(pool!, trimStr(data, s, e)); } : kind === 'int' ? row => { const s = lines[2 * row] + offset, e = s + width; return parseIntSkipLeadingWhitespace(data, s, e); diff --git a/src/reader/gro/parser.ts b/src/reader/gro/parser.ts index f4560630e..3ab681ffa 100644 --- a/src/reader/gro/parser.ts +++ b/src/reader/gro/parser.ts @@ -116,8 +116,8 @@ function handleAtoms(state: State): Schema.Atoms { const ret = { count: state.numberOfAtoms, residueNumber: col(0, 5, ColumnType.int), - residueName: col(5, 5, ColumnType.str), - atomName: col(10, 5, ColumnType.str), + residueName: col(5, 5, ColumnType.pooledStr), + atomName: col(10, 5, ColumnType.pooledStr), atomNumber: col(15, 5, ColumnType.int), x: col(pO, pW, ColumnType.float), y: col(pO + pW, pW, ColumnType.float), -- GitLab