comparison Implab/Formats/InputScanner.cs @ 229:5f7a3e1d32b9 v2

JsonXmlReader performance tuning JsonScanner now operates strings and doesn't parses number and literals. Added SerializationHelpers to common serialize/deserialize operations
author cin
date Tue, 12 Sep 2017 19:07:42 +0300
parents 6fa235c5a760
children 302ca905c19e
comparison
equal deleted inserted replaced
228:6fa235c5a760 229:5f7a3e1d32b9
1 using Implab.Automaton; 1 using Implab.Automaton;
2 using System; 2 using System;
3 using System.Collections.Generic; 3 using System.Collections.Generic;
4 using System.Linq; 4 using System.Linq;
5 using System.Runtime.CompilerServices;
5 using System.Text; 6 using System.Text;
6 using System.Threading.Tasks; 7 using System.Threading.Tasks;
7 8
8 namespace Implab.Formats { 9 namespace Implab.Formats {
9 public class InputScanner<TTag> { 10 public class InputScanner<TTag> {
28 m_initialState = initialState; 29 m_initialState = initialState;
29 m_alphabet = alphabet; 30 m_alphabet = alphabet;
30 } 31 }
31 32
32 public TTag Tag { 33 public TTag Tag {
34 [MethodImpl(MethodImplOptions.AggressiveInlining)]
33 get { 35 get {
34 return m_tags[m_state]; 36 return m_tags[m_state];
35 } 37 }
36 } 38 }
37 39
38 public int Position { 40 public int Position {
41 [MethodImpl(MethodImplOptions.AggressiveInlining)]
39 get { 42 get {
40 return m_position; 43 return m_position;
41 } 44 }
42 } 45 }
43 46
44 public bool IsFinal { 47 public bool IsFinal {
48 [MethodImpl(MethodImplOptions.AggressiveInlining)]
45 get { 49 get {
46 return m_final[m_state]; 50 return m_final[m_state];
47 } 51 }
48 } 52 }
49 53
50 public void Reset() { 54 [MethodImpl(MethodImplOptions.AggressiveInlining)]
55 public void ResetState() {
51 m_state = m_initialState; 56 m_state = m_initialState;
52 } 57 }
53 58
54 public InputScanner<TTag> Clone() { 59 public InputScanner<TTag> Clone() {
55 var clone = new InputScanner<TTag>(m_dfa, m_final, m_tags, m_initialState, m_alphabet); 60 var clone = new InputScanner<TTag>(m_dfa, m_final, m_tags, m_initialState, m_alphabet);
56 clone.m_state = m_state; 61 clone.m_state = m_state;
57 clone.m_position = m_position; 62 clone.m_position = m_position;
58 return clone; 63 return clone;
59 } 64 }
60 65
61 public bool Scan(char[] data, int offset, int length) { 66 //[MethodImpl(MethodImplOptions.AggressiveInlining)]
62 if (length <= 0) { 67 public bool Scan(char[] data, int offset, int max) {
63 m_position = offset;
64 return false; // EOF
65 }
66
67 var max = offset + length;
68 var next = m_state; 68 var next = m_state;
69 69
70 while(offset < max) { 70 while(offset < max) {
71 next = m_dfa[next, m_alphabet.Translate(data[offset])]; 71 next = m_dfa[next, m_alphabet.Translate(data[offset])];
72 if (next == AutomatonConst.UNREACHABLE_STATE) { 72 if (next == AutomatonConst.UNREACHABLE_STATE) {