DynamicArray.java 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package me.hammerle.snuviscript.array;
  2. import me.hammerle.snuviscript.code.InputProvider;
  3. import me.hammerle.snuviscript.variable.Variable;
  4. import java.lang.reflect.Array;
  5. import me.hammerle.snuviscript.code.SnuviUtils;
  6. import me.hammerle.snuviscript.code.Script;
  7. import me.hammerle.snuviscript.variable.LocalVariable;
  8. import me.hammerle.snuviscript.math.Fraction;
  9. public class DynamicArray extends InputProvider
  10. {
  11. protected Variable var;
  12. protected InputProvider[] input;
  13. public DynamicArray(Variable var, InputProvider[] input)
  14. {
  15. this.var = var;
  16. this.input = input;
  17. }
  18. public int getLength(Script sc)
  19. {
  20. return Array.getLength(var.getArray(sc));
  21. }
  22. public void init(Script sc)
  23. {
  24. int[] dims = new int[input.length];
  25. for(int i = 0; i < dims.length; i++)
  26. {
  27. dims[i] = input[i].getInt(sc);
  28. }
  29. var.set(sc, Array.newInstance(Object.class, dims));
  30. }
  31. @Override
  32. public Object getArray(Script sc)
  33. {
  34. Object ob = var.getArray(sc);
  35. for(InputProvider in : input)
  36. {
  37. ob = Array.get(ob, in.getInt(sc));
  38. }
  39. return ob;
  40. }
  41. public Object getLastArray(Script sc)
  42. {
  43. Object ob = var.getArray(sc);
  44. int end = input.length - 1;
  45. for(int j = 0; j < end; j++)
  46. {
  47. ob = Array.get(ob, input[j].getInt(sc));
  48. }
  49. return ob;
  50. }
  51. @Override
  52. public void set(Script sc, Object o)
  53. {
  54. Array.set(getLastArray(sc), input[input.length - 1].getInt(sc), o);
  55. }
  56. @Override
  57. public Object get(Script sc)
  58. {
  59. return Array.get(getLastArray(sc), input[input.length - 1].getInt(sc));
  60. }
  61. @Override
  62. public Fraction getFraction(Script sc)
  63. {
  64. return (Fraction) get(sc);
  65. }
  66. @Override
  67. public int getInt(Script sc)
  68. {
  69. return getFraction(sc).intValue();
  70. }
  71. @Override
  72. public double getDouble(Script sc)
  73. {
  74. return getFraction(sc).doubleValue();
  75. }
  76. @Override
  77. public String getString(Script sc)
  78. {
  79. Object last = getLastArray(sc);
  80. int index = input[input.length - 1].getInt(sc);
  81. try
  82. {
  83. return String.valueOf(Array.get(last, index));
  84. }
  85. catch(IllegalArgumentException ex)
  86. {
  87. return SnuviUtils.getArrayString(Array.get(last, index));
  88. }
  89. }
  90. @Override
  91. public String toString()
  92. {
  93. StringBuilder sb = new StringBuilder(var.getName());
  94. if(var instanceof LocalVariable)
  95. {
  96. sb.append("#");
  97. sb.append("L");
  98. }
  99. sb.append("[");
  100. for(InputProvider in : input)
  101. {
  102. sb.append(in);
  103. sb.append(", ");
  104. }
  105. if(input.length > 0)
  106. {
  107. sb.delete(sb.length() - 2, sb.length());
  108. }
  109. sb.append("]");
  110. return sb.toString();
  111. }
  112. }