Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //used at compile time
- public class VariableStoragePrepare
- {
- public Dictionary<string, int> namedVarMap = new Dictionary<string, int>();
- public Dictionary<int, CrplCore.Data> scripVarValues;
- public int RegisterVariable(string name)
- {
- int index;
- if(namedVarMap.TryGetValue(name, out index))
- {
- return index;
- }
- index = namedVarMap.Count;
- namedVarMap.Add(name, index);
- return index;
- }
- public int RegisterScriptVariable(string name, CrplCore.Data @value)
- {
- int index = RegisterVariable(name);
- if(scripVarValues.ContainsKey(index))
- {
- Console.WriteLine("Script variable {0} is defined more than once, overriding the value");
- }
- scripVarValues.Add(index, @value);
- return index;
- }
- }
- //used at runtime
- public class VariableStorage
- {
- private CrplCore.Data[] namedVars; //this MUST!!! have Data(0) for undefined varaibles
- private int[] namedVarsDefined;
- private Dictionary<string, IndexOrValue> allVars = new Dictionary<string, IndexOrValue>();
- public VariableStorage(VariableStoragePrepare prepare)
- {
- //initialize named vars
- namedVars = new CrplCore.Data[prepare.namedVarMap.Count];
- namedVarsDefined = new int[namedVars.Length];
- for (int i = 0; i < namedVars.Length; i++)
- {
- namedVars[i] = new CrplCore.Data(0);
- }
- //set values from script vars
- foreach (var entry in prepare.scripVarValues) {
- namedVars[entry.Key] = entry.Value;
- namedVarsDefined[entry.Key] = 1;
- }
- //fill allVars
- foreach (var entry in prepare.namedVarMap)
- {
- allVars.Add(entry.Key, new IndexOrValue(entry.Value));
- }
- }
- public void Write(int index, CrplCore.Data @value)
- {
- namedVars[index] = @value;
- namedVarsDefined[index] = 1;
- }
- public CrplCore.Data Read(int index)
- {
- return namedVars[index];
- }
- public int Exists(int index)
- {
- return namedVarsDefined[index];
- }
- public void Delete(int index)
- {
- namedVars[index] = new CrplCore.Data(0);
- namedVarsDefined[index] = 0;
- }
- public void RefWrite(string name, CrplCore.Data @value)
- {
- IndexOrValue var;
- if(allVars.TryGetValue(name, out var))
- {
- if(var.isIndex)
- {
- namedVars[var.index] = @value;
- namedVarsDefined[var.index] = 1;
- return;
- }
- }
- allVars.Add(name, new IndexOrValue(@value));
- }
- public CrplCore.Data RefRead(string name)
- {
- IndexOrValue var;
- if (allVars.TryGetValue(name, out var))
- {
- if (var.isIndex)
- {
- return namedVars[var.index];
- } else
- {
- return var.value;
- }
- }
- return new CrplCore.Data(0);
- }
- public int RefExists(string name)
- {
- IndexOrValue var;
- if (allVars.TryGetValue(name, out var))
- {
- if (var.isIndex)
- {
- return namedVarsDefined[var.index];
- }
- else
- {
- return 1;
- }
- }
- return 0;
- }
- public void RefDelete(string name)
- {
- IndexOrValue var;
- if (allVars.TryGetValue(name, out var))
- {
- if (var.isIndex)
- {
- namedVars[var.index] = new CrplCore.Data(0);
- namedVarsDefined[var.index] = 0;
- }
- else
- {
- allVars.Remove(name);
- }
- }
- }
- }
- public struct IndexOrValue
- {
- public bool isIndex;
- public int index;
- public CrplCore.Data @value;
- public IndexOrValue (int index)
- {
- isIndex = true;
- this.index = index;
- @value = new CrplCore.Data();
- }
- public IndexOrValue(CrplCore.Data @value)
- {
- isIndex = false;
- index = -1;
- this.@value = @value;
- }
- }
Add Comment
Please, Sign In to add comment