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<string, ConstantInfo> constants;
|
|
public ConstantRegistry(bool caseSensitive)
|
{
|
this.caseSensitive = caseSensitive;
|
this.constants = new Dictionary<string, ConstantInfo>();
|
}
|
|
public IEnumerator<ConstantInfo> 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();
|
}
|
}
|
}
|