using System; using System.Collections.Generic; using System.Text; namespace SuperBASIC { enum NumberType{ Ans, Number, Operand, Memory }; struct BasicNumber { internal NumberType type; readonly Runtime runtime; readonly private float number; readonly private int operand; [Serializable] public class BadNumber : Exception { public BadNumber() { } public BadNumber(string message) : base(message) { } public BadNumber(string message, Exception inner) : base(message, inner) { } protected BadNumber( System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } } internal BasicNumber(Runtime rt, float v) { type = NumberType.Number; number = v; operand = 0; runtime = rt; } internal BasicNumber(Runtime rt) { type = NumberType.Ans; number = 0; operand = 0; runtime = rt; } internal BasicNumber(Runtime rt, int v, NumberType reqType = NumberType.Operand) { if(reqType == NumberType.Operand) { type = NumberType.Operand; number = 0; operand = v; runtime = rt; } else { type = NumberType.Memory; number = 0; if (v > Int16.MaxValue) throw new BadNumber("Generated out of memory access"); operand = v; runtime = rt; } } internal int GetOperand() { return operand; } public float GetValue() { if (type == NumberType.Number) { return number; } else if(type == NumberType.Ans) { return runtime.GetRegister(); } #if MEMORY else { return Functions.Memory.MemoryGet((short)operand); } #else return 0; #endif } public static implicit operator float(BasicNumber v) => v.GetValue(); public override string ToString() => $"{number}"; } }