diff --git a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs index 55dee23..c00119a 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Drawer.cs @@ -12,6 +12,8 @@ namespace Advanced_Software_Engineering { /// public class Drawer { + protected static Dictionary ValueStorages = new Dictionary(); + /// /// The starting color of the pen / brush /// @@ -47,8 +49,6 @@ namespace Advanced_Software_Engineering { /// protected Graphics graphics; - protected Dictionary variables = new Dictionary(); - /// /// Creates a new drawer object. /// @@ -67,7 +67,7 @@ namespace Advanced_Software_Engineering { pen = new Pen(defaultColor, defaultWidth); brush = new SolidBrush(defaultColor); fill = false; - variables.Clear(); + foreach (int valueStorage in ValueStorages.Keys) ValueStorages[valueStorage].Reset(); } /// @@ -189,17 +189,17 @@ namespace Advanced_Software_Engineering { graphics.FillRectangle(new SolidBrush(pen.Color), penPosition.X, penPosition.Y, 1, 1); } - public void SetVariable(string name, IValue value) { - variables[name] = value; + public void SetStack(int name, ValueStorage value) { + ValueStorages[name] = value; } - public IValue GetVariable(string name) { - return variables[name]; + public ValueStorage GetStack(int name) { + return ValueStorages[name]; } - public bool CheckVariableExists(string name) { - if (name == null) return false; - return variables.ContainsKey(name); + public bool CheckStackExists(int name) { + return ValueStorages.ContainsKey(name); } + } } \ No newline at end of file diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs index 9a622d7..90ed48d 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/DeclareVariable.cs @@ -4,7 +4,7 @@ using System; namespace Advanced_Software_Engineering.Verbs.Value { public class DeclareVariable : IVerb { - private readonly Drawer drawer; + private readonly ValueStorage storage; private readonly IValue value; private readonly string name; @@ -46,8 +46,8 @@ namespace Advanced_Software_Engineering.Verbs.Value { return true; } - public DeclareVariable(Drawer drawer, string assignment) { - this.drawer = drawer; + public DeclareVariable(ValueStorage storage, string assignment) { + this.storage = storage; //seperate assignment characters from everything else foreach (string op in new string[] { "=", "+", "-", "*", "/" }) { @@ -70,21 +70,21 @@ namespace Advanced_Software_Engineering.Verbs.Value { if (!(assignmentStrings[1] == "=")) throw new Exception("No assignment in " + assignment); name = assignmentStrings[0]; - if (drawer.CheckVariableExists(name)) throw new Exception("Declaration failed. " + name + " has been declared before"); + if (storage.CheckVariableExists(name)) throw new Exception("Declaration failed. " + name + " has been declared before"); if (!CheckName(name)) throw new Exception("'" + name + "' name not allowed"); //preassign name - drawer.SetVariable(name, null); + storage.SetVariable(name, null); //for single number assignments ["i", "=", "20"] - if (assignmentStrings.Length == 3) value = ValueFactory.CreateValue(drawer, assignmentStrings[2]); + if (assignmentStrings.Length == 3) value = ValueFactory.CreateValue(storage, assignmentStrings[2]); //for expressions ["i", "=", "20", "+", "30"] //or some comparisons ["i", "=", "20", ">", "30"] if (assignmentStrings.Length == 5) { string op = assignmentStrings[3]; - IValue value1 = ValueFactory.CreateValue(drawer, assignmentStrings[2]); - IValue value2 = ValueFactory.CreateValue(drawer, assignmentStrings[4]); + IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[2]); + IValue value2 = ValueFactory.CreateValue(storage, assignmentStrings[4]); switch (op) { case "+": @@ -108,7 +108,7 @@ namespace Advanced_Software_Engineering.Verbs.Value { } public void ExecuteVerb() { - drawer.SetVariable(name, value); + storage.SetVariable(name, value); } public string GetDescription() { diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/UpdateVariable.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/UpdateVariable.cs index 0ba907b..7f1f53c 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/UpdateVariable.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/UpdateVariable.cs @@ -3,21 +3,21 @@ namespace Advanced_Software_Engineering.Verbs.Value { public class UpdateVariable : IVerb { - protected Drawer drawer; + protected ValueStorage storage; protected string name; protected IValue value; - private void Init(Drawer drawer, string name, IValue value) { + private void Init(ValueStorage storage, string name, IValue value) { this.name = name; this.value = value; - this.drawer = drawer; + this.storage = storage; } - public UpdateVariable(Drawer drawer, string name, IValue value) { - Init(drawer, name, value); + public UpdateVariable(ValueStorage storage, string name, IValue value) { + Init(storage, name, value); } - public UpdateVariable(Drawer drawer, string name, string value) { + public UpdateVariable(ValueStorage storage, string name, string value) { // incoming values look something like this "= 10" // or "= 10 + i" @@ -37,19 +37,19 @@ namespace Advanced_Software_Engineering.Verbs.Value { // assignmentStrings will look something like this: // ["i"] or ["10", "+", "i"] - if (assignmentStrings.Length == 1) Init(drawer, name, ValueFactory.CreateValue(drawer, assignmentStrings[0])); + if (assignmentStrings.Length == 1) Init(storage, name, ValueFactory.CreateValue(storage, assignmentStrings[0])); else if (assignmentStrings.Length == 3) { // assignmentStrings looks like this => ["10", "+", "i"] - IValue value1 = ValueFactory.CreateValue(drawer, assignmentStrings[0]); + IValue value1 = ValueFactory.CreateValue(storage, assignmentStrings[0]); string op = assignmentStrings[1]; - IValue value2 = ValueFactory.CreateValue(drawer, assignmentStrings[2]); - Init(drawer, name, new ExpressionValue(value1, value2, op)); + IValue value2 = ValueFactory.CreateValue(storage, assignmentStrings[2]); + Init(storage, name, new ExpressionValue(value1, value2, op)); } } public void ExecuteVerb() { - if (!drawer.CheckVariableExists(name)) throw new Exception("Cannot update variable because it is not declared"); - drawer.SetVariable(name, value.Clone()); + if (!storage.CheckVariableExists(name)) throw new Exception("Cannot update variable because it is not declared"); + storage.SetVariable(name, value.Clone()); } public string GetDescription() { diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueFactory.cs index 201e6b0..62d75ad 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueFactory.cs @@ -31,13 +31,13 @@ namespace Advanced_Software_Engineering.Verbs.Value { } } - public static IValue CreateValue(Drawer drawer, string paramater1, string paramater2, string parameter3, string parameter4, string type) { + public static IValue CreateValue(ValueStorage storage, string paramater1, string paramater2, string parameter3, string parameter4, string type) { switch (type) { case "color": - IValue p1 = CreateValue(drawer, paramater1); - IValue p2 = CreateValue(drawer, paramater2); - IValue p3 = CreateValue(drawer, parameter3); - IValue p4 = CreateValue(drawer, parameter4); + IValue p1 = CreateValue(storage, paramater1); + IValue p2 = CreateValue(storage, paramater2); + IValue p3 = CreateValue(storage, parameter3); + IValue p4 = CreateValue(storage, parameter4); return new ColorValue(p1, p2, p3, p4); @@ -46,12 +46,12 @@ namespace Advanced_Software_Engineering.Verbs.Value { } } - public static IValue CreateValue(Drawer drawer, string paramater1, string paramater2, string parameter3, string type) { + public static IValue CreateValue(ValueStorage storage, string paramater1, string paramater2, string parameter3, string type) { switch (type) { case "color": - IValue p1 = CreateValue(drawer, paramater1); - IValue p2 = CreateValue(drawer, paramater2); - IValue p3 = CreateValue(drawer, parameter3); + IValue p1 = CreateValue(storage, paramater1); + IValue p2 = CreateValue(storage, paramater2); + IValue p3 = CreateValue(storage, parameter3); return new ColorValue(p1, p2, p3); @@ -60,7 +60,7 @@ namespace Advanced_Software_Engineering.Verbs.Value { } } - public static IValue CreateValue(Drawer drawer, string value) { + public static IValue CreateValue(ValueStorage drawer, string value) { value = HelperFunctions.Strip(value); if (drawer.CheckVariableExists(value)) return new VariableValue(drawer, value); else return ValueHelper.ConvertToIValue(value); diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueObjects/PointValue.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueObjects/PointValue.cs index f2544f1..0e04a83 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueObjects/PointValue.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueObjects/PointValue.cs @@ -11,9 +11,9 @@ namespace Advanced_Software_Engineering.Verbs.Value.ValueObjects { this.y = y; } - public PointValue(Drawer drawer, string parameter1, string parameter2) { - x = ValueFactory.CreateValue(drawer, parameter1); - y = ValueFactory.CreateValue(drawer, parameter2); + public PointValue(ValueStorage storage, string parameter1, string parameter2) { + x = ValueFactory.CreateValue(storage, parameter1); + y = ValueFactory.CreateValue(storage, parameter2); } public PointValue(string parameter1, string parameter2) { diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs index 69f3ae9..55f036a 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueStorage.cs @@ -1,10 +1,29 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; namespace Advanced_Software_Engineering.Verbs.Value { - class ValueStorage { + public class ValueStorage { + + protected Dictionary Variables = new Dictionary(); + + public ValueStorage() { + Reset(); + } + + public void Reset() { + Variables.Clear(); + } + + public void SetVariable(string name, IValue value) { + Variables[name] = value; + } + + public IValue GetVariable(string name) { + return Variables[name]; + } + + public bool CheckVariableExists(string name) { + if (name == null) return false; + return Variables.ContainsKey(name); + } } } diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs index f0fc516..19b08c7 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/Value/ValueTypes/VariableValue.cs @@ -4,17 +4,17 @@ using System.Drawing; namespace Advanced_Software_Engineering.Verbs.Value.ValueTypes { public class VariableValue : IValue { - private readonly Drawer drawer; + private readonly ValueStorage storage; private readonly string variableName; - public VariableValue(Drawer drawer, string variableName) { + public VariableValue(ValueStorage storage, string variableName) { this.variableName = variableName; - if (!drawer.CheckVariableExists(variableName)) throw new Exception("Tried to access " + variableName + " before it was assigned. "); - this.drawer = drawer; + if (!storage.CheckVariableExists(variableName)) throw new Exception("Tried to access " + variableName + " before it was assigned. "); + this.storage = storage; } private IValue get() { - return drawer.GetVariable(variableName); + return storage.GetVariable(variableName); } public string GetDescription() { @@ -46,7 +46,7 @@ namespace Advanced_Software_Engineering.Verbs.Value.ValueTypes { } public IValue Clone() { - return new VariableValue(drawer, variableName); + return new VariableValue(storage, variableName); } } } \ No newline at end of file diff --git a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs index e57f12b..37b44c5 100644 --- a/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs +++ b/Advanced Software Engineering/Advanced Software Engineering/Verbs/VerbFactory.cs @@ -22,6 +22,16 @@ namespace Advanced_Software_Engineering { /// The command as a string /// A IVerb that maches the command public static IVerb MakeVerb(Drawer drawer, string fullCommand) { + int stackLevel = 0; + + ValueStorage rootValueStorage; + if (drawer.CheckStackExists(stackLevel)) { + rootValueStorage = drawer.GetStack(stackLevel); + } else { + rootValueStorage = new ValueStorage(); + drawer.SetStack(stackLevel, rootValueStorage); + } + CommandAndParameterParserResult result = HelperFunctions.CommandAndParameterParser(fullCommand); string command = result.getCommand(); @@ -29,9 +39,9 @@ namespace Advanced_Software_Engineering { if (command == null) throw new Exception("There is no command to process"); //check for names in directory - if (drawer.CheckVariableExists(command)) { + if (rootValueStorage.CheckVariableExists(command)) { if (commandParameters.Length == 1) { - return new UpdateVariable(drawer, command, commandParameters[0]); + return new UpdateVariable(rootValueStorage, command, commandParameters[0]); } else throw new Exception(command + "needs something to be assigned to it"); } @@ -40,22 +50,22 @@ namespace Advanced_Software_Engineering { switch (command) { case "var": if (commandParameters.Length == 1) { - return new DeclareVariable(drawer, commandParameters[0]); + return new DeclareVariable(rootValueStorage, commandParameters[0]); } else throw new Exception(command + "s need to be initialised"); default: //assignment - if (drawer.CheckVariableExists(command)) { + if (rootValueStorage.CheckVariableExists(command)) { string[] assignmentCommands = command.Split("="[0]); if (assignmentCommands.Length > 2) throw new Exception("Cannot have two assignments"); - return new UpdateVariable(drawer, assignmentCommands[0], ValueFactory.CreateValue(drawer, assignmentCommands[1])); + return new UpdateVariable(rootValueStorage, assignmentCommands[0], ValueFactory.CreateValue(rootValueStorage, assignmentCommands[1])); } break; } List parameters = new List(); if (!(commandParameters == null)) foreach (string parameter in commandParameters) { - parameters.Add(ValueFactory.CreateValue(drawer, parameter)); + parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter)); } int parameterLength = parameters.Count;