using System;
using System.Collections.Generic;
using NTERA.EmuEra.Game.EraEmu.GameData.Expression;
using NTERA.EmuEra.Game.EraEmu.GameProc;
using NTERA.EmuEra.Game.EraEmu.Sub;
namespace NTERA.EmuEra.Game.EraEmu.GameData.Variable
{
//IndexOutOfRangeException, ArgumentOutOfRangeExceptionを投げることがある。VariableTermの方で処理すること。
//引数は整数しか受け付けない。*.csvを利用した置換はVariableTermの方で処理すること
internal abstract class VariableToken
{
protected VariableToken(VariableCode varCode, VariableData varData)
{
Code = varCode;
VariableType = ((varCode & VariableCode.__INTEGER__) == VariableCode.__INTEGER__) ? typeof(Int64) : typeof(string);
VarCodeInt = (int)(varCode & VariableCode.__LOWERCASE__);
varName = varCode.ToString();
this.varData = varData;
IsForbid = false;
IsPrivate = false;
IsReference = false;
Dimension = 0;
IsGlobal = (Code == VariableCode.GLOBAL) || (Code == VariableCode.GLOBALS);
if ((Code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__)
Dimension = 1;
if ((Code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__)
Dimension = 2;
if ((Code & VariableCode.__ARRAY_3D__) == VariableCode.__ARRAY_3D__)
Dimension = 3;
IsSavedata = false;
if ((Code == VariableCode.GLOBAL) || (Code == VariableCode.GLOBALS))
IsSavedata = true;
else if ((Code & VariableCode.__SAVE_EXTENDED__) == VariableCode.__SAVE_EXTENDED__)
{
IsSavedata = true;
}
else if (((Code & VariableCode.__EXTENDED__) != VariableCode.__EXTENDED__)
&& ((Code & VariableCode.__CALC__) != VariableCode.__CALC__)
&& ((Code & VariableCode.__UNCHANGEABLE__) != VariableCode.__UNCHANGEABLE__)
&& ((Code & VariableCode.__LOCAL__) != VariableCode.__LOCAL__)
&& (!varName.StartsWith("NOTUSE_")))
{
VariableCode flag = Code & (VariableCode.__ARRAY_1D__ | VariableCode.__ARRAY_2D__ | VariableCode.__ARRAY_3D__ | VariableCode.__STRING__ | VariableCode.__INTEGER__ | VariableCode.__CHARACTER_DATA__);
switch (flag)
{
case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER__)
IsSavedata = true;
break;
case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING__)
IsSavedata = true;
break;
case VariableCode.__CHARACTER_DATA__ | VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_INTEGER_ARRAY__)
IsSavedata = true;
break;
case VariableCode.__CHARACTER_DATA__ | VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_CHARACTER_STRING_ARRAY__)
IsSavedata = true;
break;
case VariableCode.__INTEGER__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_INTEGER__)
IsSavedata = true;
break;
case VariableCode.__STRING__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_STRING__)
IsSavedata = true;
break;
case VariableCode.__INTEGER__ | VariableCode.__ARRAY_1D__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_INTEGER_ARRAY__)
IsSavedata = true;
break;
case VariableCode.__STRING__ | VariableCode.__ARRAY_1D__:
if (VarCodeInt < (int)VariableCode.__COUNT_SAVE_STRING_ARRAY__)
IsSavedata = true;
break;
}
}
}
public readonly VariableCode Code;
public readonly int VarCodeInt;
protected readonly VariableData varData;
protected string varName;
public Type VariableType { get; protected set; }
public bool CanRestructure { get; protected set; }
public string Name => varName;
//CodeEEにしているけど実際はExeEEかもしれない
public virtual Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{ throw new CodeEE("整数型でない変数" + varName + "を整数型として呼び出しました"); }
public virtual string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{ throw new CodeEE("文字列型でない変数" + varName + "を文字列型として呼び出しました"); }
public virtual void SetValue(Int64 value, Int64[] arguments)
{ throw new CodeEE("整数型でない変数" + varName + "を整数型として呼び出しました"); }
public virtual void SetValue(string value, Int64[] arguments)
{ throw new CodeEE("文字列型でない変数" + varName + "を文字列型として呼び出しました"); }
public virtual void SetValue(Int64[] values, Int64[] arguments)
{ throw new CodeEE("整数型配列でない変数" + varName + "を整数型配列として呼び出しました"); }
public virtual void SetValue(string[] values, Int64[] arguments)
{ throw new CodeEE("文字列型配列でない変数" + varName + "を文字列型配列として呼び出しました"); }
public virtual void SetValueAll(Int64 value, int start, int end, int charaPos)
{ throw new CodeEE("整数型配列でない変数" + varName + "を整数型配列として呼び出しました"); }
public virtual void SetValueAll(string value, int start, int end, int charaPos)
{ throw new CodeEE("文字列型配列でない変数" + varName + "を文字列型配列として呼び出しました"); }
public virtual Int64 PlusValue(Int64 value, Int64[] arguments)
{ throw new CodeEE("整数型でない変数" + varName + "を整数型として呼び出しました"); }
public virtual Int32 GetLength()
{ throw new CodeEE("配列型でない変数" + varName + "の長さを取得しようとしました"); }
public virtual Int32 GetLength(int dimension)
{ throw new CodeEE("配列型でない変数" + varName + "の長さを取得しようとしました"); }
public virtual object GetArray()
{
if (IsCharacterData)
throw new CodeEE("キャラクタ変数" + varName + "を非キャラ変数として呼び出しました");
throw new CodeEE("配列型でない変数" + varName + "の配列を取得しようとしました");
}
public virtual object GetArrayChara(int charano)
{
if (!IsCharacterData)
throw new CodeEE("非キャラクタ変数" + varName + "をキャラ変数として呼び出しました");
throw new CodeEE("配列型でない変数" + varName + "の配列を取得しようとしました");
}
public void throwOutOfRangeException(Int64[] arguments, Exception e)
{
CheckElement(arguments, new[] { true, true, true });
throw e;
}
public virtual void CheckElement(Int64[] arguments, bool[] doCheck) { }
public void CheckElement(Int64[] arguments)
{
CheckElement(arguments, new[] { true, true, true });
}
public virtual void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments, new[] { true, true, true });
}
public int CodeInt => VarCodeInt;
public VariableCode CodeFlag => Code & VariableCode.__UPPERCASE__;
public bool IsNull => Code == VariableCode.__NULL__;
public bool IsCharacterData => ((Code & VariableCode.__CHARACTER_DATA__) == VariableCode.__CHARACTER_DATA__);
public bool IsInteger => ((Code & VariableCode.__INTEGER__) == VariableCode.__INTEGER__);
public bool IsString => ((Code & VariableCode.__STRING__) == VariableCode.__STRING__);
public bool IsArray1D => ((Code & VariableCode.__ARRAY_1D__) == VariableCode.__ARRAY_1D__);
public bool IsArray2D => ((Code & VariableCode.__ARRAY_2D__) == VariableCode.__ARRAY_2D__);
public bool IsArray3D => ((Code & VariableCode.__ARRAY_3D__) == VariableCode.__ARRAY_3D__);
///
/// 1810alpha007 諸事情によりReadOnlyからIsConstに改名。
///
public virtual bool IsConst => ((Code & VariableCode.__UNCHANGEABLE__) == VariableCode.__UNCHANGEABLE__);
public bool IsCalc => ((Code & VariableCode.__CALC__) == VariableCode.__CALC__);
public bool IsLocal => ((Code & VariableCode.__LOCAL__) == VariableCode.__LOCAL__);
public bool CanForbid => ((Code & VariableCode.__CAN_FORBID__) == VariableCode.__CAN_FORBID__);
public bool IsForbid { get; protected set; }
public bool IsPrivate { get; protected set; }
public bool IsGlobal { get; protected set; }
public bool IsSavedata { get; protected set; }
public bool IsReference { get; protected set; }
public int Dimension { get; protected set; }
}
internal abstract class CharaVariableToken : VariableToken
{
protected CharaVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
sizes = CharacterData.CharacterVarLength(varCode, varData.Constant);
if (sizes != null)
{
totalSize = 1;
for (int i = 0; i < sizes.Length; i++)
totalSize *= sizes[i];
IsForbid = totalSize == 0;
}
IsPrivate = false;
CanRestructure = false;
}
protected int[] sizes;
protected int totalSize;
public override Int32 GetLength()
{
if (sizes.Length == 1)
return sizes[0];
if (sizes.Length == 0)
throw new CodeEE("非配列型のキャラ変数" + varName + "の長さを取得しようとしました");
throw new CodeEE(Dimension + "次元配列型のキャラ変数" + varName + "の長さを次元を指定せずに取得しようとしました");
}
public override Int32 GetLength(int dimension)
{
if (sizes.Length == 0)
throw new CodeEE("非配列型のキャラ変数" + varName + "の長さを取得しようとしました");
if (dimension < sizes.Length)
return sizes[dimension];
throw new CodeEE("配列型変数のキャラ変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= varData.CharacterList.Count)))
throw new CodeEE("Character array variable " + varName + " at the first argument (" + arguments[0] + ") is out of range of the character registration number");
if (doCheck.Length > 1 && sizes.Length > 0 && doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= sizes[0])))
throw new CodeEE("Character array variable " + varName + " at the second argument (" + arguments[1] + ") is out of range of the array");
if (doCheck.Length > 2 && sizes.Length > 1 && doCheck[2] && ((arguments[2] < 0) || (arguments[2] >= sizes[1])))
throw new CodeEE("Character array variable " + varName + " at the third argument (" + arguments[2] + ") is out of range of the array");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
CharacterData chara = varData.CharacterList[(int)arguments[0]];
if ((index1 < 0) || (index1 > sizes[0]))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > sizes[0]))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
internal abstract class UserDefinedVariableToken : VariableToken
{
protected UserDefinedVariableToken(VariableCode varCode, UserDefinedVariableData data)
: base(varCode, null)
{
varName = data.Name;
IsPrivate = data.Private;
isConst = data.Const;
sizes = data.Lengths;
IsGlobal = data.Global;
IsSavedata = data.Save;
//Dimension = sizes.Length;
totalSize = 1;
for (int i = 0; i < sizes.Length; i++)
totalSize *= sizes[i];
IsForbid = totalSize == 0;
CanRestructure = isConst;
}
public abstract void SetDefault();
protected bool isConst;
protected int[] sizes;
protected int totalSize;
//public bool IsGlobal { get; protected set; }
//public bool IsSavedata { get; protected set; }
public override bool IsConst => isConst;
public override Int32 GetLength()
{
if (Dimension == 1)
return sizes[0];
throw new CodeEE(Dimension + "次元配列型変数" + varName + "の長さを取得しようとしました");
}
public override Int32 GetLength(int dimension)
{
if (dimension < Dimension)
return sizes[dimension];
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
//if (array == null)
// throw new ExeEE("プライベート変数" + varName + "の配列が用意されていない");
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= sizes[0])))
throw new CodeEE("配列型変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
if (sizes.Length >= 2 && ((arguments[1] < 0) || (arguments[1] >= sizes[1])))
throw new CodeEE("配列型変数" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
if (sizes.Length >= 3 && ((arguments[2] < 0) || (arguments[2] >= sizes[2])))
throw new CodeEE("配列型変数" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > sizes[Dimension - 1]))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > sizes[Dimension - 1]))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
public abstract void In();
public abstract void Out();
public bool IsStatic { get; protected set; }
}
internal abstract class UserDefinedCharaVariableToken : CharaVariableToken
{
protected UserDefinedCharaVariableToken(VariableCode varCode, UserDefinedVariableData data, VariableData varData, int arrayIndex)
: base(varCode, varData)
{
ArrayIndex = arrayIndex;
DimData = data;
varName = data.Name;
sizes = data.Lengths;
IsGlobal = data.Global;
IsSavedata = data.Save;
//Dimension = sizes.Length;
totalSize = 1;
for (int i = 0; i < sizes.Length; i++)
totalSize *= sizes[i];
IsForbid = totalSize == 0;
}
public readonly UserDefinedVariableData DimData;
public readonly int ArrayIndex;
public override object GetArrayChara(int charano)
{
return varData.CharacterList[charano].UserDefCVarDataList[ArrayIndex];
}
}
//1808beta009 廃止 UserDefinedVariableTokenで一括して扱う
//internal abstract class PrivateVariableToken : UserDefinedVariableToken
//{
// protected PrivateVariableToken(VariableCode varCode, UserDefinedVariableData data)
// : base(varCode, data)
// {
// IsPrivate = true;
// }
//}
///
/// 1808beta009 追加
/// 参照型。public もあるよ
///
internal abstract class ReferenceToken : UserDefinedVariableToken
{
protected ReferenceToken(VariableCode varCode, UserDefinedVariableData data)
: base(varCode, data)
{
CanRestructure = false;
IsStatic = !data.Private;
IsReference = true;
arrayList = new List();
IsForbid = false;
}
protected List arrayList;
protected Array array;
public override void SetDefault()
{//Defaultのセットは参照元がやるべき
}
public override Int32 GetLength()
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
if (Dimension != 1)
throw new CodeEE(Dimension + "次元配列型変数" + varName + "の長さを取得しようとしました");
return array.Length;
}
public override Int32 GetLength(int dimension)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
if (dimension < Dimension)
return array.GetLength(dimension);
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
throw new CodeEE("配列型変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
if (Dimension >= 2 && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
throw new CodeEE("配列型変数" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
if (Dimension >= 3 && ((arguments[2] < 0) || (arguments[2] >= array.GetLength(2))))
throw new CodeEE("配列型変数" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.GetLength(Dimension - 1)))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.GetLength(Dimension - 1)))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
int counter;
public override void In()
{
if (counter > 0)
arrayList.Add(array);
counter++;
array = null;
}
public override void Out()
{
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
counter--;
}
public override object GetArray()
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return array;
}
public void SetRef(Array refArray)
{
array = refArray;
}
///
/// 型が一致するかどうか(参照可能かどうか)
///
///
///
public bool MatchType(VariableToken rother, bool allowChara, out string errMes)
{
errMes = "";
if (rother == null)
{ errMes = "参照先変数は省略できません"; return false; }
if (rother.IsCalc)
{ errMes = "疑似変数は参照できません"; return false; }
//TODO constの参照
//if (rother.IsConst != this.isConst)
if (rother.IsConst)
{ errMes = "定数は参照できません"; return false; }
//1812 ローカル参照の条件変更
//ローカルかつDYNAMICなREFはローカル参照できる
if ((!IsPrivate) && (rother.IsPrivate || rother.IsLocal))
{ errMes = "広域の参照変数はローカル変数を参照できません"; return false; }
////1810beta002 ローカル参照禁止
//if ((!rother.IsReference) && (rother.IsPrivate || rother.IsLocal))
//{ errMes = "ローカル変数は参照できません"; return false; }
if (rother.IsCharacterData && !allowChara)
{ errMes = "キャラ変数は参照できません"; return false; }
if (IsInteger != rother.IsInteger)
{ errMes = "型が異なる変数は参照できません"; return false; }
if (Dimension != rother.Dimension)
{ errMes = "次元数が異なる変数は参照できません"; return false; }
return true;
}
}
internal abstract class LocalVariableToken : VariableToken
{
public LocalVariableToken(VariableCode varCode, VariableData varData, string subId, int size)
: base(varCode, varData)
{
CanRestructure = false;
subID = subId;
this.size = size;
}
public abstract void SetDefault();
public abstract void resize(int newSize);
protected string subID;
protected int size;
public override Int32 GetLength()
{
return size;
}
public override Int32 GetLength(int dimension)
{
if (dimension == 0)
return size;
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
//if (array == null)
// throw new ExeEE("プライベート変数" + varName + "の配列が用意されていない");
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= size)))
throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > size))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > size))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
//サブクラスの詳細はVariableData以外は知らなくてよい
internal sealed partial class VariableData
{
#region 変数
private sealed class IntVariableToken : VariableToken
{
public IntVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataInteger;
}
Int64[] array;
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[VarCodeInt];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[VarCodeInt] = value;
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
array[VarCodeInt] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[VarCodeInt] += value;
return array[VarCodeInt];
}
}
private sealed class Int1DVariableToken : VariableToken
{
public Int1DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataIntegerArray[VarCodeInt];
IsForbid = array.Length == 0;
}
Int64[] array;
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
for (int i = start; i < end; i++)
array[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0]] += value;
return array[arguments[0]];
}
public override Int32 GetLength()
{ return array.Length; }
public override Int32 GetLength(int dimension)
{
if (dimension == 0)
return array.Length;
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.Length))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.Length))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class Int2DVariableToken : VariableToken
{
public Int2DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataIntegerArray2D[VarCodeInt];
IsForbid = array.Length == 0;
}
Int64[,] array;
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0], arguments[1]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1]] += value;
return array[arguments[0], arguments[1]];
}
public override Int32 GetLength()
{ throw new CodeEE("2次元配列型変数" + varName + "の長さを取得しようとしました"); }
public override Int32 GetLength(int dimension)
{
if ((dimension == 0) || (dimension == 1))
return array.GetLength(dimension);
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
throw new CodeEE("二次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
throw new CodeEE("二次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.GetLength(1)))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.GetLength(1)))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class Int3DVariableToken : VariableToken
{
public Int3DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataIntegerArray3D[VarCodeInt];
IsForbid = array.Length == 0;
}
Int64[, ,] array;
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
array[i, j, k] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] += value;
return array[arguments[0], arguments[1], arguments[2]];
}
public override Int32 GetLength()
{ throw new CodeEE("3次元配列型変数" + varName + "の長さを取得しようとしました"); }
public override Int32 GetLength(int dimension)
{
if ((dimension == 0) || (dimension == 1) || (dimension == 2))
return array.GetLength(dimension);
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
throw new CodeEE("三次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
throw new CodeEE("三次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
if (doCheck[2] && ((arguments[2] < 0) || (arguments[2] >= array.GetLength(2))))
throw new CodeEE("三次元配列" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.GetLength(2)))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.GetLength(2)))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class StrVariableToken : VariableToken
{
public StrVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataString;
IsForbid = array.Length == 0;
}
string[] array;
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[VarCodeInt];
}
public override void SetValue(string value, Int64[] arguments)
{
array[VarCodeInt] = value;
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
array[VarCodeInt] = value;
}
}
private sealed class Str1DVariableToken : VariableToken
{
public Str1DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataStringArray[VarCodeInt];
IsForbid = array.Length == 0;
}
string[] array;
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
//Bartoum : Str.csv variable names switch here, so we try to translate
return Translation.translate(array[arguments[0]], "Str", translate);
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
for (int i = start; i < end; i++)
array[i] = value;
}
public override Int32 GetLength()
{ return array.Length; }
public override Int32 GetLength(int dimension)
{
if (dimension == 0)
return array.Length;
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.Length))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.Length))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class Str2DVariableToken : VariableToken
{
public Str2DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataStringArray2D[VarCodeInt];
IsForbid = array.Length == 0;
}
string[,] array;
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0], arguments[1]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0], arguments[1]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override Int32 GetLength()
{ throw new CodeEE("2次元配列型変数" + varName + "の長さを取得しようとしました"); }
public override Int32 GetLength(int dimension)
{
if ((dimension == 0) || (dimension == 1))
return array.GetLength(dimension);
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
throw new CodeEE("二次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
throw new CodeEE("二次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.GetLength(1)))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.GetLength(1)))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class Str3DVariableToken : VariableToken
{
public Str3DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
array = varData.DataStringArray3D[VarCodeInt];
IsForbid = array.Length == 0;
}
string[, ,] array;
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
array[i, j, k] = value;
}
public override Int32 GetLength()
{ throw new CodeEE("3次元配列型変数" + varName + "の長さを取得しようとしました"); }
public override Int32 GetLength(int dimension)
{
if ((dimension == 0) || (dimension == 1) || (dimension == 2))
return array.GetLength(dimension);
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.GetLength(0))))
throw new CodeEE("三次元配列" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
if (doCheck[1] && ((arguments[1] < 0) || (arguments[1] >= array.GetLength(1))))
throw new CodeEE("三次元配列" + varName + "の第2引数(" + arguments[1] + ")は配列の範囲外です");
if (doCheck[2] && ((arguments[2] < 0) || (arguments[2] >= array.GetLength(2))))
throw new CodeEE("三次元配列" + varName + "の第3引数(" + arguments[2] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.GetLength(2)))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.GetLength(2)))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class CharaIntVariableToken : CharaVariableToken
{
public CharaIntVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
return chara.DataInteger[VarCodeInt];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataInteger[VarCodeInt] = value;
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
varData.CharacterList[charaPos].setValueAll(VarCodeInt, value);
//CharacterData chara = varData.CharacterList[charaPos];
//chara.DataInteger[VarCodeInt] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataInteger[VarCodeInt] += value;
return chara.DataInteger[VarCodeInt];
}
}
private sealed class CharaInt1DVariableToken : CharaVariableToken
{
public CharaInt1DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
return chara.DataIntegerArray[VarCodeInt][arguments[1]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataIntegerArray[VarCodeInt][arguments[1]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
Int64[] array = chara.DataIntegerArray[VarCodeInt];
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
varData.CharacterList[charaPos].setValueAll1D(VarCodeInt, value, start, end);
//CharacterData chara = varData.CharacterList[charaPos];
//Int64[] array = chara.DataIntegerArray[VarCodeInt];
//for (int i = start; i < end; i++)
// array[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataIntegerArray[VarCodeInt][arguments[1]] += value;
return chara.DataIntegerArray[VarCodeInt][arguments[1]];
}
public override object GetArrayChara(int charano)
{
CharacterData chara = varData.CharacterList[charano];
return chara.DataIntegerArray[VarCodeInt];
}
}
private sealed class CharaStrVariableToken : CharaVariableToken
{
public CharaStrVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
return chara.DataString[VarCodeInt];
}
public override void SetValue(string value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataString[VarCodeInt] = value;
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
varData.CharacterList[charaPos].setValueAll(VarCodeInt, value);
//CharacterData chara = varData.CharacterList[charaPos];
//chara.DataString[VarCodeInt] = value;
}
}
private sealed class CharaStr1DVariableToken : CharaVariableToken
{
public CharaStr1DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
return chara.DataStringArray[VarCodeInt][arguments[1]];
}
public override void SetValue(string value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataStringArray[VarCodeInt][arguments[1]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
string[] array = chara.DataStringArray[VarCodeInt];
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
varData.CharacterList[charaPos].setValueAll1D(VarCodeInt, value, start, end);
//CharacterData chara = varData.CharacterList[charaPos];
//String[] array = chara.DataStringArray[VarCodeInt];
//for (int i = start; i < end; i++)
// array[i] = value;
}
public override object GetArrayChara(int charano)
{
CharacterData chara = varData.CharacterList[charano];
return chara.DataStringArray[VarCodeInt];
}
}
private sealed class CharaInt2DVariableToken : CharaVariableToken
{
public CharaInt2DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
return chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
Int64[,] array = chara.DataIntegerArray2D[VarCodeInt];
int start = (int)arguments[2];
int end = start + values.Length;
int index1 = (int)arguments[1];
for (int i = start; i < end; i++)
array[index1, i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
varData.characterList[charaPos].setValueAll2D(VarCodeInt, value);
//CharacterData chara = varData.CharacterList[charaPos];
//Int64[,] array = chara.DataIntegerArray2D[VarCodeInt];
//int a1 = array.GetLength(0);
//int a2 = array.GetLength(1);
//for (int i = 0; i < a1; i++)
// for (int j = 0; j < a2; j++)
// array[i, j] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]] += value;
return chara.DataIntegerArray2D[VarCodeInt][arguments[1], arguments[2]];
}
public override object GetArrayChara(int charano)
{
CharacterData chara = varData.CharacterList[charano];
return chara.DataIntegerArray2D[VarCodeInt];
}
}
private sealed class CharaStr2DVariableToken : CharaVariableToken
{
public CharaStr2DVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
return chara.DataStringArray2D[VarCodeInt][arguments[1], arguments[2]];
}
public override void SetValue(string value, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
chara.DataStringArray2D[VarCodeInt][arguments[1], arguments[2]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
CharacterData chara = varData.CharacterList[(int)arguments[0]];
string[,] array = chara.DataStringArray2D[VarCodeInt];
int start = (int)arguments[2];
int end = start + values.Length;
int index1 = (int)arguments[1];
for (int i = start; i < end; i++)
array[index1, i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
varData.characterList[charaPos].setValueAll2D(VarCodeInt, value);
//CharacterData chara = varData.CharacterList[charaPos];
//String[,] array = chara.DataStringArray2D[VarCodeInt];
//int a1 = array.GetLength(0);
//int a2 = array.GetLength(1);
//for (int i = 0; i < a1; i++)
// for (int j = 0; j < a2; j++)
// array[i, j] = value;
}
public override object GetArrayChara(int charano)
{
CharacterData chara = varData.CharacterList[charano];
return chara.DataStringArray2D[VarCodeInt];
}
}
#endregion
#region 定数
private abstract class ConstantToken : VariableToken
{
public ConstantToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override void SetValue(Int64 value, Int64[] arguments)
{ throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
public override void SetValue(string value, Int64[] arguments)
{ throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
public override void SetValue(Int64[] values, Int64[] arguments)
{ throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
public override void SetValue(string[] values, Int64[] arguments)
{ throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{ throw new CodeEE("読み取り専用の変数" + varName + "に代入しようとしました"); }
}
private sealed class IntConstantToken : ConstantToken
{
public IntConstantToken(VariableCode varCode, VariableData varData, Int64 i)
: base(varCode, varData)
{
this.i = i;
}
Int64 i;
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return i;
}
}
private sealed class StrConstantToken : ConstantToken
{
public StrConstantToken(VariableCode varCode, VariableData varData, string s)
: base(varCode, varData)
{
this.s = s;
}
string s;
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return s;
}
}
private sealed class Int1DConstantToken : ConstantToken
{
public Int1DConstantToken(VariableCode varCode, VariableData varData, Int64[] array)
: base(varCode, varData)
{
this.array = array;
IsForbid = array.Length == 0;
}
Int64[] array;
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0]];
}
public override Int32 GetLength()
{ return array.Length; }
public override Int32 GetLength(int dimension)
{
if (dimension == 0)
return array.Length;
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.Length))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.Length))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
private sealed class Str1DConstantToken : ConstantToken
{
string name;
public Str1DConstantToken(VariableCode varCode, VariableData varData, string[] array)
: base(varCode, varData)
{
this.array = array;
IsForbid = array.Length == 0;
name = "Base";
}
public Str1DConstantToken(VariableCode varCode, VariableData varData, string pname)
: base(varCode, varData)
{
name = pname;
array = varData.constant.GetCsvNameList(varCode);
IsForbid = array.Length == 0;
}
string[] array;
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
//Changes by Bartoum
//This is where the _TR files translate. They can only translate stuff that is on a print line
//Exemple PRINTFORM [%TALENTNAME:X%]
return Translation.translate(array[arguments[0]], name, translate);
}
public override Int32 GetLength()
{ return array.Length; }
public override Int32 GetLength(int dimension)
{
if (dimension == 0)
return array.Length;
throw new CodeEE("配列型変数" + varName + "の存在しない次元の長さを取得しようとしました");
}
public override object GetArray() { return array; }
public override void CheckElement(Int64[] arguments, bool[] doCheck)
{
if (doCheck[0] && ((arguments[0] < 0) || (arguments[0] >= array.Length)))
throw new CodeEE("配列変数" + varName + "の第1引数(" + arguments[0] + ")は配列の範囲外です");
}
public override void IsArrayRangeValid(Int64[] arguments, Int64 index1, Int64 index2, string funcName, Int64 i1, Int64 i2)
{
CheckElement(arguments);
if ((index1 < 0) || (index1 > array.Length))
throw new CodeEE(funcName + "命令の第" + i1 + "引数(" + index1 + ")は配列" + varName + "の範囲外です");
if ((index2 < 0) || (index2 > array.Length))
throw new CodeEE(funcName + "命令の第" + i2 + "引数(" + index2 + ")は配列" + varName + "の範囲外です");
}
}
#endregion
#region 特殊処理
private abstract class PseudoVariableToken : VariableToken
{
protected PseudoVariableToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override void SetValue(Int64 value, Int64[] arguments)
{ throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
public override void SetValue(string value, Int64[] arguments)
{ throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
public override void SetValue(Int64[] values, Int64[] arguments)
{ throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
public override void SetValue(string[] values, Int64[] arguments)
{ throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{ throw new CodeEE("擬似変数" + varName + "に代入しようとしました"); }
public override Int32 GetLength()
{ throw new CodeEE("擬似変数" + varName + "の長さを取得しようとしました"); }
public override Int32 GetLength(int dimension)
{ throw new CodeEE("擬似変数" + varName + "の長さを取得しようとしました"); }
public override object GetArray()
{ throw new CodeEE("擬似変数" + varName + "の配列を取得しようとしました"); }
}
private sealed class RandToken : PseudoVariableToken
{
public RandToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
Int64 i = arguments[0];
if (i <= 0)
throw new CodeEE("RANDの引数に0以下の値(" + i + ")が指定されました");
return exm.VEvaluator.GetNextRand(i);
}
}
private sealed class CompatiRandToken : PseudoVariableToken
{
public CompatiRandToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
Int64 i = arguments[0];
if (i == 0)
return 0L;
if (i < 0)
i = -i;
return exm.VEvaluator.GetNextRand(32768) % i;//0-32767の乱数を引数で除算した余り
}
}
private sealed class CHARANUM_Token : PseudoVariableToken
{
public CHARANUM_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return varData.CharacterList.Count;
}
}
private sealed class LASTLOAD_TEXT_Token : PseudoVariableToken
{
public LASTLOAD_TEXT_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return varData.LastLoadText;
}
}
private sealed class LASTLOAD_VERSION_Token : PseudoVariableToken
{
public LASTLOAD_VERSION_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return varData.LastLoadVersion;
}
}
private sealed class LASTLOAD_NO_Token : PseudoVariableToken
{
public LASTLOAD_NO_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return varData.LastLoadNo;
}
}
private sealed class LINECOUNT_Token : PseudoVariableToken
{
public LINECOUNT_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return exm.Console.LineCount;
}
}
private sealed class WINDOW_TITLE_Token : VariableToken
{
public WINDOW_TITLE_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return GlobalStatic.Console.GetWindowTitle();
}
public override void SetValue(string value, Int64[] arguments)
{
GlobalStatic.Console.SetWindowTitle(value);
}
}
private sealed class MONEYLABEL_Token : VariableToken
{
public MONEYLABEL_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return Config.Config.MoneyLabel;
}
}
private sealed class DRAWLINESTR_Token : VariableToken
{
public DRAWLINESTR_Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override string GetStrValue(ExpressionMediator exm, long[] arguments, bool translate=false)
{
return exm.Console.getDefStBar();
}
}
private sealed class EmptyStrToken : PseudoVariableToken
{
public EmptyStrToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return "";
}
}
private sealed class EmptyIntToken : PseudoVariableToken
{
public EmptyIntToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return 0L;
}
}
private sealed class Debug__FILE__Token : PseudoVariableToken
{
public Debug__FILE__Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
LogicalLine line = exm.Process.GetScaningLine();
if ((line == null) || (line.Position == null))
return "";
return line.Position.Filename;
}
}
private sealed class Debug__FUNCTION__Token : PseudoVariableToken
{
public Debug__FUNCTION__Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
LogicalLine line = exm.Process.GetScaningLine();
if ((line == null) || (line.ParentLabelLine == null))
return "";//システム待機中のデバッグモードから呼び出し
return line.ParentLabelLine.LabelName;
}
}
private sealed class Debug__LINE__Token : PseudoVariableToken
{
public Debug__LINE__Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
LogicalLine line = exm.Process.GetScaningLine();
if ((line == null) || (line.Position == null))
return -1L;
return line.Position.LineNo;
}
}
private sealed class ISTIMEOUTToken : PseudoVariableToken
{
public ISTIMEOUTToken(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = false;
}
public override long GetIntValue(ExpressionMediator exm, long[] arguments)
{
return Convert.ToInt64(GlobalStatic.Console.IsTimeOut);
}
}
private sealed class __INT_MAX__Token : PseudoVariableToken
{
public __INT_MAX__Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override long GetIntValue(ExpressionMediator exm, long[] arguments)
{
return Int64.MaxValue;
}
}
private sealed class __INT_MIN__Token : PseudoVariableToken
{
public __INT_MIN__Token(VariableCode varCode, VariableData varData)
: base(varCode, varData)
{
CanRestructure = true;
}
public override long GetIntValue(ExpressionMediator exm, long[] arguments)
{
return Int64.MinValue;
}
}
private sealed class EMUERA_VERSIONToken : PseudoVariableToken
{
public EMUERA_VERSIONToken(VariableCode varCode, VariableData varData)
:base(varCode, varData)
{
CanRestructure = true;
}
public override string GetStrValue(ExpressionMediator exm, long[] arguments, bool translate=false)
{
return GlobalStatic.MainWindow.InternalEmueraVer;
}
}
#endregion
#region LOCAL
private sealed class LocalInt1DVariableToken : LocalVariableToken
{
public LocalInt1DVariableToken(VariableCode varCode, VariableData varData, string subId, int size)
: base(varCode, varData, subId, size)
{
}
Int64[] array;
public override void SetDefault()
{
if (array != null)
Array.Clear(array, 0, size);
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
if (array == null)
array = new Int64[size];
return array[arguments[0]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
if (array == null)
array = new Int64[size];
array[arguments[0]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
if (array == null)
array = new Int64[size];
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
if (array == null)
array = new Int64[size];
for (int i = start; i < end; i++)
array[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
if (array == null)
array = new Int64[size];
array[arguments[0]] += value;
return array[arguments[0]];
}
public override object GetArray()
{
if (array == null)
array = new Int64[size];
return array;
}
public override void resize(int newSize)
{
size = newSize;
array = null;
}
}
//Bartoum: this is where ARGS and LOCALS are
private sealed class LocalStr1DVariableToken : LocalVariableToken
{
public LocalStr1DVariableToken(VariableCode varCode, VariableData varData, string subId, int size)
: base(varCode, varData, subId, size)
{
}
string[] array;
public override void SetDefault()
{
if (array != null)
Array.Clear(array, 0, size);
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
if (array == null)
array = new string[size];
return array[arguments[0]];
}
public override void SetValue(string value, Int64[] arguments)
{
if (array == null)
array = new string[size];
array[arguments[0]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
if (array == null)
array = new string[size];
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
if (array == null)
array = new string[size];
for (int i = start; i < end; i++)
array[i] = value;
}
public override object GetArray()
{
if (array == null)
array = new string[size];
return array;
}
public override void resize(int newSize)
{
size = newSize;
array = null;
}
}
#endregion
#region userdef
//1808beta009 廃止 private static と統合
//private sealed class UserDefinedInt1DVariableToken : UserDefinedVariableToken
#region static (広域変数とprivate static の両方を含む)
private sealed class StaticInt1DVariableToken : UserDefinedVariableToken
{
public StaticInt1DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VAR, data)
{
int[] sizes = data.Lengths;
IsStatic = true;
array = new Int64[sizes[0]];
defArray = data.DefaultInt;
if (defArray != null)
Array.Copy(defArray, array, defArray.Length);
}
Int64[] array;
Int64[] defArray;
public override void SetDefault()
{
Array.Clear(array, 0, totalSize);
if (defArray != null)
Array.Copy(defArray, array, defArray.Length);
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
for (int i = start; i < end; i++)
array[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0]] += value;
return array[arguments[0]];
}
public override object GetArray() { return array; }
public override void In() { }
public override void Out() { }
}
private sealed class StaticInt2DVariableToken : UserDefinedVariableToken
{
public StaticInt2DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VAR2D, data)
{
int[] sizes = data.Lengths;
IsStatic = true;
array = new Int64[sizes[0], sizes[1]];
}
Int64[,] array;
public override void SetDefault()
{
Array.Clear(array, 0, totalSize);
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0], arguments[1]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1]] += value;
return array[arguments[0], arguments[1]];
}
public override object GetArray() { return array; }
public override void In() { }
public override void Out() { }
}
private sealed class StaticInt3DVariableToken : UserDefinedVariableToken
{
public StaticInt3DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VAR3D, data)
{
int[] sizes = data.Lengths;
IsStatic = true;
array = new Int64[sizes[0], sizes[1], sizes[2]];
}
Int64[, ,] array;
public override void SetDefault()
{
Array.Clear(array, 0, totalSize);
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
array[i, j, k] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] += value;
return array[arguments[0], arguments[1], arguments[2]];
}
public override object GetArray() { return array; }
public override void In() { }
public override void Out() { }
}
//Bartoum: this is where user string variables are
private sealed class StaticStr1DVariableToken : UserDefinedVariableToken
{
public StaticStr1DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VARS, data)
{
int[] sizes = data.Lengths;
IsStatic = true;
array = new string[sizes[0]];
defArray = data.DefaultStr;
if (defArray != null)
Array.Copy(defArray, array, defArray.Length);
}
string[] array;
string[] defArray;
public override void SetDefault()
{
Array.Clear(array, 0, totalSize);
if (defArray != null)
Array.Copy(defArray, array, defArray.Length);
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
for (int i = start; i < end; i++)
array[i] = value;
}
public override object GetArray() { return array; }
public override void In() { }
public override void Out() { }
}
private sealed class StaticStr2DVariableToken : UserDefinedVariableToken
{
public StaticStr2DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VARS2D, data)
{
int[] sizes = data.Lengths;
IsStatic = true;
array = new string[sizes[0], sizes[1]];
}
string[,] array;
public override void SetDefault()
{
Array.Clear(array, 0, totalSize);
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0], arguments[1]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0], arguments[1]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override object GetArray() { return array; }
public override void In() { }
public override void Out() { }
}
private sealed class StaticStr3DVariableToken : UserDefinedVariableToken
{
public StaticStr3DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VARS3D, data)
{
int[] sizes = data.Lengths;
IsStatic = true;
array = new string[sizes[0], sizes[1], sizes[2]];
}
string[, ,] array;
public override void SetDefault()
{
Array.Clear(array, 0, totalSize);
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
array[i, j, k] = value;
}
public override object GetArray() { return array; }
public override void In() { }
public override void Out() { }
}
#endregion
#region private dynamic
private sealed class PrivateInt1DVariableToken : UserDefinedVariableToken
{
public PrivateInt1DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VAR, data)
{
int[] sizes = data.Lengths;
IsStatic = false;
arrayList = new List();
defArray = data.DefaultInt;
}
readonly List arrayList;
Int64[] array;
Int64[] defArray;
//int counter = 0;
public override void SetDefault()
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
for (int i = start; i < end; i++)
array[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0]] += value;
return array[arguments[0]];
}
public override object GetArray() { return array; }
public override void In()
{
if (array != null)
arrayList.Add(array);
//counter++;
array = new Int64[sizes[0]];
if (defArray != null)
Array.Copy(defArray, array, defArray.Length);
}
public override void Out()
{
//counter--;
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
}
}
private sealed class PrivateInt2DVariableToken : UserDefinedVariableToken
{
public PrivateInt2DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VAR2D, data)
{
int[] sizes = data.Lengths;
IsStatic = false;
arrayList = new List();
}
readonly List arrayList;
Int64[,] array;
//int counter = 0;
public override void SetDefault() { }
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0], arguments[1]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1]] += value;
return array[arguments[0], arguments[1]];
}
public override object GetArray() { return array; }
public override void In()
{
if (array != null)
arrayList.Add(array);
//counter++;
array = new Int64[sizes[0], sizes[1]];
}
public override void Out()
{
//counter--;
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
}
}
private sealed class PrivateInt3DVariableToken : UserDefinedVariableToken
{
public PrivateInt3DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VAR3D, data)
{
int[] sizes = data.Lengths;
IsStatic = false;
arrayList = new List();
}
readonly List arrayList;
Int64[, ,] array;
//int counter = 0;
public override void SetDefault() { }
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
return array[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
array[i, j, k] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] += value;
return array[arguments[0], arguments[1], arguments[2]];
}
public override object GetArray() { return array; }
public override void In()
{
if (array != null)
arrayList.Add(array);
//counter++;
array = new Int64[sizes[0], sizes[1], sizes[2]];
}
public override void Out()
{
//counter--;
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
}
}
private sealed class PrivateStr1DVariableToken : UserDefinedVariableToken
{
public PrivateStr1DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VARS, data)
{
int[] sizes = data.Lengths;
IsStatic = false;
arrayList = new List();
defArray = data.DefaultStr;
}
//int counter = 0;
readonly List arrayList;
string[] array;
string[] defArray;
public override void SetDefault()
{
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
for (int i = start; i < end; i++)
array[i] = value;
}
public override object GetArray() { return array; }
public override void In()
{
//counter++;
if (array != null)
arrayList.Add(array);
array = new string[sizes[0]];
if (defArray != null)
Array.Copy(defArray, array, defArray.Length);
//arrayList.Add(array);
}
public override void Out()
{
//counter--;
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
}
}
private sealed class PrivateStr2DVariableToken : UserDefinedVariableToken
{
public PrivateStr2DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VARS2D, data)
{
int[] sizes = data.Lengths;
IsStatic = false;
arrayList = new List();
}
//int counter = 0;
readonly List arrayList;
string[,] array;
public override void SetDefault()
{
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0], arguments[1]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0], arguments[1]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override object GetArray() { return array; }
public override void In()
{
//counter++;
if (array != null)
arrayList.Add(array);
array = new string[sizes[0], sizes[1]];
//arrayList.Add(array);
}
public override void Out()
{
//counter--;
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
}
}
private sealed class PrivateStr3DVariableToken : UserDefinedVariableToken
{
public PrivateStr3DVariableToken(UserDefinedVariableData data)
: base(VariableCode.VARS3D, data)
{
int[] sizes = data.Lengths;
IsStatic = false;
arrayList = new List();
}
//int counter = 0;
readonly List arrayList;
string[, ,] array;
public override void SetDefault() { }
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
return array[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(string value, Int64[] arguments)
{
array[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
array[i, j, k] = value;
}
public override object GetArray() { return array; }
public override void In()
{
//counter++;
if (array != null)
arrayList.Add(array);
array = new string[sizes[0], sizes[1], sizes[2]];
//arrayList.Add(array);
}
public override void Out()
{
//counter--;
//arrayList.RemoveAt(arrayList.Count - 1);
if (arrayList.Count > 0)
{
array = arrayList[arrayList.Count - 1];
arrayList.RemoveAt(arrayList.Count - 1);
}
else
array = null;
}
}
#endregion
#region ref
//1808beta009で追加
///
/// public staticとprivate dynamicをクラスレベルでは区別しない
/// 1808beta009時点ではprivate dynamicのみ
///
private sealed class ReferenceInt1DToken : ReferenceToken
{
public ReferenceInt1DToken(UserDefinedVariableData data)
: base(VariableCode.REF, data)
{
CanRestructure = false;
IsStatic = !data.Private;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return ((Int64[])array)[arguments[0]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((Int64[])array)[arguments[0]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
((Int64[])array)[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
for (int i = start; i < end; i++)
((Int64[])array)[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((Int64[])array)[arguments[0]] += value;
return ((Int64[])array)[arguments[0]];
}
}
private sealed class ReferenceInt2DToken : ReferenceToken
{
public ReferenceInt2DToken(UserDefinedVariableData data)
: base(VariableCode.REF2D, data)
{
CanRestructure = false;
IsStatic = !data.Private;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return ((Int64[,])array)[arguments[0], arguments[1]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((Int64[,])array)[arguments[0], arguments[1]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
((Int64[,])array)[arguments[0], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
((Int64[,])array)[i, j] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((Int64[,])array)[arguments[0], arguments[1]] += value;
return ((Int64[,])array)[arguments[0], arguments[1]];
}
}
private sealed class ReferenceInt3DToken : ReferenceToken
{
public ReferenceInt3DToken(UserDefinedVariableData data)
: base(VariableCode.REF3D, data)
{
CanRestructure = false;
IsStatic = !data.Private;
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return ((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
((Int64[, ,])array)[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
((Int64[, ,])array)[i, j, k] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]] += value;
return ((Int64[, ,])array)[arguments[0], arguments[1], arguments[2]];
}
}
private sealed class ReferenceStr1DToken : ReferenceToken
{
public ReferenceStr1DToken(UserDefinedVariableData data)
: base(VariableCode.REFS, data)
{
CanRestructure = false;
IsStatic = !data.Private;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return ((string[])array)[arguments[0]];
}
public override void SetValue(string value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((string[])array)[arguments[0]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
int start = (int)arguments[0];
int end = start + values.Length;
for (int i = start; i < end; i++)
((string[])array)[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
for (int i = start; i < end; i++)
((string[])array)[i] = value;
}
}
private sealed class ReferenceStr2DToken : ReferenceToken
{
public ReferenceStr2DToken(UserDefinedVariableData data)
: base(VariableCode.REFS2D, data)
{
CanRestructure = false;
IsStatic = !data.Private;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return ((string[,])array)[arguments[0], arguments[1]];
}
public override void SetValue(string value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((string[,])array)[arguments[0], arguments[1]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
((string[,])array)[arguments[0], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
((string[,])array)[i, j] = value;
}
}
private sealed class ReferenceStr3DToken : ReferenceToken
{
public ReferenceStr3DToken(UserDefinedVariableData data)
: base(VariableCode.REFS3D, data)
{
CanRestructure = false;
IsStatic = !data.Private;
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
return ((string[, ,])array)[arguments[0], arguments[1], arguments[2]];
}
public override void SetValue(string value, Int64[] arguments)
{
if (array == null)
throw new CodeEE("参照型変数" + varName + "は何も参照していません");
((string[, ,])array)[arguments[0], arguments[1], arguments[2]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
int start = (int)arguments[2];
int end = start + values.Length;
for (int i = start; i < end; i++)
((string[, ,])array)[arguments[0], arguments[1], i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
int a1 = array.GetLength(0);
int a2 = array.GetLength(1);
int a3 = array.GetLength(2);
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
for (int k = 0; k < a3; k++)
((string[, ,])array)[i, j, k] = value;
}
}
#endregion
#region chara (広域のみ)
private sealed class UserDefinedCharaInt1DVariableToken : UserDefinedCharaVariableToken
{
public UserDefinedCharaInt1DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
: base(VariableCode.CVAR, data, varData, arrayIndex)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
return array[arguments[1]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
array[arguments[1]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
Int64[] array = (Int64[])GetArrayChara(charaPos);
for (int i = start; i < end; i++)
array[i] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
Int64[] array = (Int64[])GetArrayChara((int)arguments[0]);
array[arguments[1]] += value;
return array[arguments[1]];
}
}
private sealed class UserDefinedCharaStr1DVariableToken : UserDefinedCharaVariableToken
{
public UserDefinedCharaStr1DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
: base(VariableCode.CVARS, data, varData, arrayIndex)
{
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
string[] array = (string[])GetArrayChara((int)arguments[0]);
return array[arguments[1]];
}
public override void SetValue(string value, Int64[] arguments)
{
string[] array = (string[])GetArrayChara((int)arguments[0]);
array[arguments[1]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
string[] array = (string[])GetArrayChara((int)arguments[0]);
int start = (int)arguments[1];
int end = start + values.Length;
for (int i = start; i < end; i++)
array[i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
string[] array = (string[])GetArrayChara(charaPos);
for (int i = start; i < end; i++)
array[i] = value;
}
}
private sealed class UserDefinedCharaInt2DVariableToken : UserDefinedCharaVariableToken
{
public UserDefinedCharaInt2DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
: base(VariableCode.CVAR2D, data, varData, arrayIndex)
{
}
public override Int64 GetIntValue(ExpressionMediator exm, Int64[] arguments)
{
Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
return array[arguments[1], arguments[2]];
}
public override void SetValue(Int64 value, Int64[] arguments)
{
Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
array[arguments[1], arguments[2]] = value;
}
public override void SetValue(Int64[] values, Int64[] arguments)
{
Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
int start = (int)arguments[2];
int end = start + values.Length;
int index1 = (int)arguments[1];
for (int i = start; i < end; i++)
array[index1, i] = values[i - start];
}
public override void SetValueAll(long value, int start, int end, int charaPos)
{
Int64[,] array = (Int64[,])GetArrayChara(charaPos);
int a1 = sizes[0];
int a2 = sizes[1];
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
public override Int64 PlusValue(Int64 value, Int64[] arguments)
{
Int64[,] array = (Int64[,])GetArrayChara((int)arguments[0]);
array[arguments[1], arguments[2]] += value;
return array[arguments[1], arguments[2]];
}
}
private sealed class UserDefinedCharaStr2DVariableToken : UserDefinedCharaVariableToken
{
public UserDefinedCharaStr2DVariableToken(UserDefinedVariableData data, VariableData varData, int arrayIndex)
: base(VariableCode.CVARS2D, data, varData, arrayIndex)
{
}
public override string GetStrValue(ExpressionMediator exm, Int64[] arguments, bool translate = false)
{
string[,] array = (string[,])GetArrayChara((int)arguments[0]);
return array[arguments[1], arguments[2]];
}
public override void SetValue(string value, Int64[] arguments)
{
string[,] array = (string[,])GetArrayChara((int)arguments[0]);
array[arguments[1], arguments[2]] = value;
}
public override void SetValue(string[] values, Int64[] arguments)
{
string[,] array = (string[,])GetArrayChara((int)arguments[0]);
int start = (int)arguments[2];
int end = start + values.Length;
int index1 = (int)arguments[1];
for (int i = start; i < end; i++)
array[index1, i] = values[i - start];
}
public override void SetValueAll(string value, int start, int end, int charaPos)
{
string[,] array = (string[,])GetArrayChara(charaPos);
int a1 = sizes[0];
int a2 = sizes[1];
for (int i = 0; i < a1; i++)
for (int j = 0; j < a2; j++)
array[i, j] = value;
}
}
#endregion
#endregion
}
}