diff Implab/Formats/CharMap.cs @ 228:6fa235c5a760 v2

Rewritten JsonScanner, JsonParser, fixed naming style
author cin
date Tue, 12 Sep 2017 01:19:12 +0300
parents
children 302ca905c19e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Implab/Formats/CharMap.cs	Tue Sep 12 01:19:12 2017 +0300
@@ -0,0 +1,42 @@
+using Implab.Automaton;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Implab.Formats {
+    public class CharMap : IAlphabet<char> {
+        readonly char m_min;
+        readonly char m_max;
+        readonly int[] m_map;
+
+        public CharMap(char min, int[] map) {
+            Safe.ArgumentNotNull(map, nameof(map));
+            Count = map.Max()+1;
+            m_min = min;
+            m_map = map;
+            m_max = (char)(min + map.Length);
+        }
+
+        public int Count {
+            get; private set;
+        }
+
+        public bool Contains(char symbol) {
+            return symbol >= m_min && symbol <= m_max && m_map[symbol-m_min] != AutomatonConst.UNCLASSIFIED_INPUT;
+        }
+
+        public IEnumerable<char> GetSymbols(int cls) {
+            for (var i = 0; i < m_map.Length; i++)
+                if (m_map[i] == cls)
+                    yield return (char)(i + m_min);
+        }
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public int Translate(char symbol) {
+            return symbol >= m_min && symbol <= m_max ? m_map[symbol-m_min] : AutomatonConst.UNCLASSIFIED_INPUT;
+        }
+    }
+}