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