選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

95 行
1.8 KiB

using System;
using System.Collections.Generic;
using System.Text;
namespace SuperBASIC
{
enum NumberType{
Ans,
Number,
Operand,
Memory
};
public struct BasicNumber
{
internal NumberType type;
internal 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() => $"{GetValue()}";
}
}