1
0
Files
otyaSMILEBASIC/SMILEBASIC/type.d

117 lines
2.3 KiB
D
Raw Normal View History

2015-06-03 19:51:42 +09:00
module otya.smilebasic.type;
enum ValueType : byte
{
Void,//DEF A()ENDの返り値とか未初期化の変数とか
2015-06-03 19:51:42 +09:00
Integer,
Double,
String,
Array,
IntegerArray,
DoubleArray,
StringArray,
}
struct Value
{
ValueType type;
union
{
int integerValue;
double doubleValue;
wstring stringValue;
2015-06-10 19:09:15 +09:00
Array!int intArray;
2015-06-03 19:51:42 +09:00
}
this(int value)
{
this.type = ValueType.Integer;
integerValue = value;
}
this(double value)
{
this.type = ValueType.Double;
doubleValue = value;
}
this(wstring value)
{
this.type = ValueType.String;
stringValue = value;
}
this(ValueType type)
{
this.type = type;
if(type == ValueType.String)
{
stringValue = "";
}
}
void castOp(ValueType type)
{
switch(type)
{
case ValueType.Double:
break;
default:
break;
}
}
2015-06-06 17:11:02 +09:00
bool boolValue()
{
switch(type)
{
case ValueType.Double:
return this.doubleValue != 0;
case ValueType.Integer:
return this.integerValue != 0;
case ValueType.String:
return true;//3.1現在では文字列はtrue(ただし!"A"などは動かない)
default:
2015-06-07 14:35:03 +09:00
//配列はtype mismatch
2015-06-06 17:11:02 +09:00
return false;
}
}
2015-06-03 19:51:42 +09:00
}
2015-06-10 19:09:15 +09:00
class Array(T)
{
T[] array;
//最大要素数2^^31
//4次元配列
int[4] dim;
int dimCount;
this(int len)
{
dim[0] = len;
dim[1] = 0;
dim[2] = 0;
dim[3] = 0;
array = new T[len];
dimCount = 1;
}
this(int[] dim)
{
int len = 1;
foreach(int i; dim)
{
len *= i;
}
array = new T[len];
dimCount = dim.length;
}
T opIndex(int i1)
{
return array[i1];
}
T opIndex(int i1, int i2)
{
return array[i1 * dim[0] + i2];
}
T opIndex(int i1, int i2, int i3)
{
return array[i1 * dim[0] * dim[1] + i2 * dim[1] + i3];
}
T opIndex(int i1, int i2, int i3, int i4)
{
return array[i1];//array[i1 * dim[0] * dim[1] * dim[2] + i2 * dim[1] + i3];
}
}