Updated to ValueStorage

This commit is contained in:
Lukasz Baldyga committed 2020-11-29 15:42:39 +00:00
1 parent 7ed91d7998
commit 3b6bfa11a6
8 files changed
+91 -62

No files matched your search

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