From 6fd5e1908bb7f5024a49b3cad2748d4c746b4c32 Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Tue, 5 Sep 2017 10:55:22 -0700
Subject: [PATCH] gro, faster atom line handling

---
 src/reader/gro.ts   | 19 +++++++++++--------
 src/utils/tokens.ts |  5 +++++
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/reader/gro.ts b/src/reader/gro.ts
index 966da0c95..3bf31ce03 100644
--- a/src/reader/gro.ts
+++ b/src/reader/gro.ts
@@ -193,25 +193,28 @@ function handleAtoms (state: GroState, block: GroBlock) {
     const columnCount = columns.length
     const tokens = Tokens.create(state.numberOfAtoms * 2 * columnCount)
 
+    let start: number
+    let end: number
+    let valueStart: number
+    let valueEnd: number = state.position
+
     for (let i = 0; i < state.numberOfAtoms; ++i) {
         state.currentTokenStart = state.position
-        eatLine(state)
-        // console.log('atom line', state.data.substring(state.currentTokenStart, state.currentTokenEnd))
-
-        let start: number
-        let end = state.currentTokenStart
+        end = state.currentTokenStart
         for (let j = 0; j < columnCount; ++j) {
             start = end
             end = start + fieldSizes[j]
 
             // trim
-            let valueStart = start
-            let valueEnd = end
+            valueStart = start
+            valueEnd = end
             while (valueStart < valueEnd && state.data.charCodeAt(valueStart) === 32) ++valueStart;
             while (valueEnd > valueStart && state.data.charCodeAt(valueEnd - 1) === 32) --valueEnd;
 
-            Tokens.add(tokens, valueStart, valueEnd)
+            Tokens.addUnchecked(tokens, valueStart, valueEnd)
         }
+        state.position = valueEnd
+        eatLine(state)
     }
 
     block.addTable(new TextTable(state.data, name, columns, tokens));
diff --git a/src/utils/tokens.ts b/src/utils/tokens.ts
index 93af43bb6..32e1a207d 100644
--- a/src/utils/tokens.ts
+++ b/src/utils/tokens.ts
@@ -25,6 +25,11 @@ export namespace Tokens {
         tokens.indices[tokens.count++] = end;
     }
 
+    export function addUnchecked(tokens: Tokens, start: number, end: number) {
+        tokens.indices[tokens.count++] = start;
+        tokens.indices[tokens.count++] = end;
+    }
+
     export function create(size: number): Tokens {
         return {
             indicesLenMinus2: (size - 2) | 0,
-- 
GitLab