kajacx

Varaible Manager

Dec 2nd, 2017
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.80 KB | None | 0 0
  1. //used at compile time
  2.     public class VariableStoragePrepare
  3.     {
  4.         public Dictionary<string, int> namedVarMap = new Dictionary<string, int>();
  5.         public Dictionary<int, CrplCore.Data> scripVarValues;
  6.  
  7.         public int RegisterVariable(string name)
  8.         {
  9.             int index;
  10.             if(namedVarMap.TryGetValue(name, out index))
  11.             {
  12.                 return index;
  13.             }
  14.             index = namedVarMap.Count;
  15.             namedVarMap.Add(name, index);
  16.             return index;
  17.         }
  18.  
  19.         public int RegisterScriptVariable(string name, CrplCore.Data @value)
  20.         {
  21.             int index = RegisterVariable(name);
  22.  
  23.             if(scripVarValues.ContainsKey(index))
  24.             {
  25.                 Console.WriteLine("Script variable {0} is defined more than once, overriding the value");
  26.             }
  27.  
  28.             scripVarValues.Add(index, @value);
  29.  
  30.             return index;
  31.         }
  32.     }
  33.  
  34.     //used at runtime
  35.     public class VariableStorage
  36.     {
  37.         private CrplCore.Data[] namedVars; //this MUST!!! have Data(0) for undefined varaibles
  38.         private int[] namedVarsDefined;
  39.         private Dictionary<string, IndexOrValue> allVars = new Dictionary<string, IndexOrValue>();
  40.  
  41.         public VariableStorage(VariableStoragePrepare prepare)
  42.         {
  43.  
  44.             //initialize named vars
  45.             namedVars = new CrplCore.Data[prepare.namedVarMap.Count];
  46.             namedVarsDefined = new int[namedVars.Length];
  47.             for (int i = 0; i < namedVars.Length; i++)
  48.             {
  49.                 namedVars[i] = new CrplCore.Data(0);
  50.             }
  51.  
  52.             //set values from script vars
  53.             foreach (var entry in prepare.scripVarValues) {
  54.                 namedVars[entry.Key] = entry.Value;
  55.                 namedVarsDefined[entry.Key] = 1;
  56.             }
  57.  
  58.             //fill allVars
  59.             foreach (var entry in prepare.namedVarMap)
  60.             {
  61.                 allVars.Add(entry.Key, new IndexOrValue(entry.Value));
  62.             }
  63.         }
  64.  
  65.         public void Write(int index, CrplCore.Data @value)
  66.         {
  67.             namedVars[index] = @value;
  68.             namedVarsDefined[index] = 1;
  69.         }
  70.  
  71.         public CrplCore.Data Read(int index)
  72.         {
  73.             return namedVars[index];
  74.         }
  75.  
  76.         public int Exists(int index)
  77.         {
  78.             return namedVarsDefined[index];
  79.         }
  80.  
  81.         public void Delete(int index)
  82.         {
  83.             namedVars[index] = new CrplCore.Data(0);
  84.             namedVarsDefined[index] = 0;
  85.         }
  86.  
  87.         public void RefWrite(string name, CrplCore.Data @value)
  88.         {
  89.             IndexOrValue var;
  90.             if(allVars.TryGetValue(name, out var))
  91.             {
  92.                 if(var.isIndex)
  93.                 {
  94.                     namedVars[var.index] = @value;
  95.                     namedVarsDefined[var.index] = 1;
  96.                     return;
  97.                 }
  98.             }
  99.             allVars.Add(name, new IndexOrValue(@value));
  100.         }
  101.  
  102.         public CrplCore.Data RefRead(string name)
  103.         {
  104.             IndexOrValue var;
  105.             if (allVars.TryGetValue(name, out var))
  106.             {
  107.                 if (var.isIndex)
  108.                 {
  109.                     return namedVars[var.index];
  110.                 } else
  111.                 {
  112.                     return var.value;
  113.                 }
  114.             }
  115.             return new CrplCore.Data(0);
  116.         }
  117.  
  118.         public int RefExists(string name)
  119.         {
  120.             IndexOrValue var;
  121.             if (allVars.TryGetValue(name, out var))
  122.             {
  123.                 if (var.isIndex)
  124.                 {
  125.                     return namedVarsDefined[var.index];
  126.                 }
  127.                 else
  128.                 {
  129.                     return 1;
  130.                 }
  131.             }
  132.             return 0;
  133.         }
  134.  
  135.         public void RefDelete(string name)
  136.         {
  137.             IndexOrValue var;
  138.             if (allVars.TryGetValue(name, out var))
  139.             {
  140.                 if (var.isIndex)
  141.                 {
  142.                     namedVars[var.index] = new CrplCore.Data(0);
  143.                     namedVarsDefined[var.index] = 0;
  144.                 }
  145.                 else
  146.                 {
  147.                     allVars.Remove(name);
  148.                 }
  149.             }
  150.         }
  151.     }
  152.  
  153.     public struct IndexOrValue
  154.     {
  155.         public bool isIndex;
  156.         public int index;
  157.         public CrplCore.Data @value;
  158.  
  159.         public IndexOrValue (int index)
  160.         {
  161.             isIndex = true;
  162.             this.index = index;
  163.             @value = new CrplCore.Data();
  164.         }
  165.  
  166.         public IndexOrValue(CrplCore.Data @value)
  167.         {
  168.             isIndex = false;
  169.             index = -1;
  170.             this.@value = @value;
  171.         }
  172.     }
Add Comment
Please, Sign In to add comment