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>
public class Drawer {
protected static Dictionary<int, ValueStorage> ValueStorages = new Dictionary<int, ValueStorage>();
/// <summary>
/// The starting color of the pen / brush
/// </summary>
@@ -47,8 +49,6 @@ namespace Advanced_Software_Engineering {
/// </summary>
protected Graphics graphics;
protected Dictionary<string, IValue> variables = new Dictionary<string, IValue>();
/// <summary>
/// Creates a new drawer object.
/// </summary>
@@ -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();
}
/// <summary>
@@ -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);
}
}
}
@@ -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() {
@@ -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() {
@@ -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);
@@ -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) {
@@ -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<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 {
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);
}
}
}
@@ -22,6 +22,16 @@ namespace Advanced_Software_Engineering {
/// <param name="fullCommand">The command as a string</param>
/// <returns>A IVerb that maches the command</returns>
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<IValue> parameters = new List<IValue>();
if (!(commandParameters == null)) foreach (string parameter in commandParameters) {
parameters.Add(ValueFactory.CreateValue(drawer, parameter));
parameters.Add(ValueFactory.CreateValue(rootValueStorage, parameter));
}
int parameterLength = parameters.Count;