using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using Jace.Util; namespace Jace.Execution { public class ConstantRegistry : IConstantRegistry { private readonly bool caseSensitive; private readonly Dictionary constants; public ConstantRegistry(bool caseSensitive) { this.caseSensitive = caseSensitive; this.constants = new Dictionary(); } public IEnumerator GetEnumerator() { return constants.Values.GetEnumerator(); } IEnumerator System.Collections.IEnumerable.GetEnumerator() { return this.GetEnumerator(); } public ConstantInfo GetConstantInfo(string constantName) { if (string.IsNullOrEmpty(constantName)) throw new ArgumentNullException("constantName"); ConstantInfo constantInfo = null; return constants.TryGetValue(ConvertConstantName(constantName), out constantInfo) ? constantInfo : null; } public bool IsConstantName(string constantName) { if (string.IsNullOrEmpty(constantName)) throw new ArgumentNullException("constantName"); return constants.ContainsKey(ConvertConstantName(constantName)); } public void RegisterConstant(string constantName, double value) { RegisterConstant(constantName, value, true); } public void RegisterConstant(string constantName, double value, bool isOverWritable) { if(string.IsNullOrEmpty(constantName)) throw new ArgumentNullException("constantName"); constantName = ConvertConstantName(constantName); if (constants.ContainsKey(constantName) && !constants[constantName].IsOverWritable) { string message = string.Format("The constant \"{0}\" cannot be overwriten.", constantName); throw new Exception(message); } ConstantInfo constantInfo = new ConstantInfo(constantName, value, isOverWritable); if (constants.ContainsKey(constantName)) constants[constantName] = constantInfo; else constants.Add(constantName, constantInfo); } private string ConvertConstantName(string constantName) { return caseSensitive ? constantName : constantName.ToLowerFast(); } } }