view Implab/Formats/CharAlphabet.cs @ 236:302ca905c19e v2

JsonReader optimizations
author cin
date Tue, 21 Nov 2017 14:57:58 +0300
parents 6fa235c5a760
children
line wrap: on
line source

using System.Collections.Generic;
using System.Linq;
using Implab.Automaton;
using System;

namespace Implab.Formats {
    public class CharAlphabet : IndexedAlphabetBase<char> {

        public override int GetSymbolIndex(char symbol) {
            return symbol;
        }

        public IEnumerable<char> InputSymbols {
            get { return Enumerable.Range(char.MinValue, char.MaxValue).Cast<char>(); }
        }

        public CharMap CreateCharMap() {
            var map = new Dictionary<int, int>();

            int max = 0, min = char.MaxValue;
            foreach (var p in Mappings) {
                var index = GetSymbolIndex(p.Key);
                max = Math.Max(max, index);
                min = Math.Min(min, index);
                map[index] = p.Value;
            }

            var result = new int[max - min + 1];

            for (int i = 0; i < result.Length; i++)
                map.TryGetValue(min + i, out result[i]);

            return new CharMap((char)min, result);
        }
    }
}