view Implab/Formats/CharMap.cs @ 250:9f63dade3a40 v3

Working on runnable component
author cin
date Thu, 01 Feb 2018 02:43:35 +0300
parents 302ca905c19e
children
line wrap: on
line source

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.UnclassifiedInput;
        }

        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.UnclassifiedInput;
        }
    }
}