field.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /**
  2. * Copyright (c) 2017-2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  6. */
  7. import { Column, ColumnHelpers } from 'mol-data/db'
  8. import * as TokenColumn from '../../common/text/column/token'
  9. import { Tokens } from '../../common/text/tokenizer'
  10. import * as Data from '../data-model'
  11. import { parseInt as fastParseInt, parseFloat as fastParseFloat } from '../../common/text/number-parser'
  12. export default function CifTextField(tokens: Tokens, rowCount: number): Data.CifField {
  13. const { data, indices } = tokens;
  14. const str: Data.CifField['str'] = row => {
  15. const ret = data.substring(indices[2 * row], indices[2 * row + 1]);
  16. if (ret === '.' || ret === '?') return '';
  17. return ret;
  18. };
  19. const int: Data.CifField['int'] = row => {
  20. return fastParseInt(data, indices[2 * row], indices[2 * row + 1]) || 0;
  21. };
  22. const float: Data.CifField['float'] = row => {
  23. return fastParseFloat(data, indices[2 * row], indices[2 * row + 1]) || 0;
  24. };
  25. const valueKind: Data.CifField['valueKind'] = row => {
  26. const s = indices[2 * row];
  27. if (indices[2 * row + 1] - s !== 1) return Column.ValueKind.Present;
  28. const v = data.charCodeAt(s);
  29. if (v === 46 /* . */) return Column.ValueKind.NotPresent;
  30. if (v === 63 /* ? */) return Column.ValueKind.Unknown;
  31. return Column.ValueKind.Present;
  32. };
  33. return {
  34. __array: void 0,
  35. binaryEncoding: void 0,
  36. isDefined: true,
  37. rowCount,
  38. str,
  39. int,
  40. float,
  41. valueKind,
  42. areValuesEqual: TokenColumn.areValuesEqualProvider(tokens),
  43. toStringArray: params => ColumnHelpers.createAndFillArray(rowCount, str, params),
  44. toIntArray: params => ColumnHelpers.createAndFillArray(rowCount, int, params),
  45. toFloatArray: params => ColumnHelpers.createAndFillArray(rowCount, float, params)
  46. }
  47. }