﻿namespace GostCryptography.Asn1.Ber
{
	abstract class Asn1CharSet
	{
		private readonly int _aBitsPerChar;
		private readonly int _uBitsPerChar;

		protected internal Asn1CharSet(int nchars)
		{
			_uBitsPerChar = Asn1Integer.GetBitCount(nchars - 1);
			_aBitsPerChar = 1;

			while (_uBitsPerChar > _aBitsPerChar)
			{
				_aBitsPerChar = _aBitsPerChar << 1;
			}
		}

		public abstract int MaxValue { get; }

		public abstract int GetCharAtIndex(int index);

		public abstract int GetCharIndex(int charValue);

		public virtual int GetNumBitsPerChar(bool aligned)
		{
			if (!aligned)
			{
				return _uBitsPerChar;
			}

			return _aBitsPerChar;
		}
	}
}