@JRubyMethod(name = "+") public IRubyObject op_plus(ThreadContext context, IRubyObject other) { if (other instanceof ArrayJavaProxy) { Object otherArray = ((ArrayJavaProxy)other).getObject(); if (getObject().getClass().getComponentType().isAssignableFrom(otherArray.getClass().getComponentType())) { return ArrayUtils.concatArraysDirect(context, getObject(), otherArray); } } return ArrayUtils.concatArraysDirect(context, getObject(), other); }
public static IRubyObject concatArraysDirect(ThreadContext context, Object original, Object additional) { int oldLength = Array.getLength(original); int addLength = Array.getLength(additional); ArrayJavaProxy proxy = newProxiedArray(context.runtime, original.getClass().getComponentType(), oldLength + addLength); Object newArray = proxy.getObject(); System.arraycopy(original, 0, newArray, 0, oldLength); System.arraycopy(additional, 0, newArray, oldLength, addLength); return proxy; }
public static IRubyObject concatArraysDirect(ThreadContext context, Object original, Object additional) { int oldLength = Array.getLength(original); int addLength = Array.getLength(additional); ArrayJavaProxy proxy = newProxiedArray(context.runtime, original.getClass().getComponentType(), oldLength + addLength); Object newArray = proxy.getObject(); System.arraycopy(original, 0, newArray, 0, oldLength); System.arraycopy(additional, 0, newArray, oldLength, addLength); return proxy; }
public static IRubyObject javaArraySubarrayDirect(ThreadContext context, Object fromArray, int index, int size) { int actualLength = Array.getLength(fromArray); if (index >= actualLength) return context.nil; if (index + size > actualLength) { size = actualLength - index; } ArrayJavaProxy proxy = ArrayUtils.newProxiedArray(context.runtime, fromArray.getClass().getComponentType(), size); Object newArray = proxy.getObject(); System.arraycopy(fromArray, index, newArray, 0, size); return proxy; }
@JRubyMethod(name = "+") public IRubyObject op_plus(ThreadContext context, IRubyObject other) { final Object array = getObject(); if ( other instanceof ArrayJavaProxy ) { final Object otherArray = ((ArrayJavaProxy) other).getObject(); final Class<?> componentType = array.getClass().getComponentType(); if ( componentType.isAssignableFrom( otherArray.getClass().getComponentType() ) ) { return ArrayUtils.concatArraysDirect(context, array, otherArray); } } return ArrayUtils.concatArraysDirect(context, array, other); }
@JRubyMethod(name = "eql?") public RubyBoolean eql_p(ThreadContext context, IRubyObject obj) { boolean equals = false; if ( obj instanceof ArrayJavaProxy ) { final ArrayJavaProxy that = (ArrayJavaProxy) obj; equals = arraysEquals(this.getObject(), that.getObject()); } else if ( obj.getClass().isArray() ) { equals = arraysEquals(getObject(), obj); } return context.runtime.newBoolean(equals); }
@JRubyMethod(name = "eql?") public RubyBoolean eql_p(ThreadContext context, IRubyObject obj) { boolean equals = false; if ( obj instanceof ArrayJavaProxy ) { final ArrayJavaProxy that = (ArrayJavaProxy) obj; equals = arraysEquals(this.getObject(), that.getObject()); } else if ( obj.getClass().isArray() ) { equals = arraysEquals(getObject(), obj); } return context.runtime.newBoolean(equals); }
@JRubyMethod public IRubyObject each(ThreadContext context, Block block) { Ruby runtime = context.runtime; int length = Array.getLength(getObject()); for (int i = 0; i < length; i++) { IRubyObject rubyObj = ArrayUtils.arefDirect(runtime, getObject(), converter, i); block.yield(context, rubyObj); } return this; }
@JRubyMethod(name = "last") // ~ Array#last public IRubyObject last(ThreadContext context) { final Object array = getObject(); final int len = Array.getLength(array); if ( len == 0 ) return context.nil; return JavaUtil.convertJavaArrayElementToRuby(context.runtime, converter, array, len - 1); }
@JRubyMethod(name = "first") // Enumerable override public IRubyObject first(ThreadContext context) { final Object array = getObject(); // Enumerable does not raise when length == 0 (compatibility) if ( Array.getLength(array) == 0 ) return context.nil; return JavaUtil.convertJavaArrayElementToRuby(context.runtime, converter, array, 0); }
@JRubyMethod(name = { "to_a", "entries" }, alias = "to_ary") public RubyArray to_a(ThreadContext context) { final Object array = getObject(); return JavaUtil.convertJavaArrayToRubyWithNesting(context, array); }
@JRubyMethod(name = "component_type") public IRubyObject component_type(ThreadContext context) { Class<?> componentType = getObject().getClass().getComponentType(); final JavaClass javaClass = JavaClass.get(context.runtime, componentType); return Java.getProxyClass(context.runtime, javaClass); }
@Override public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule clazz, String name) { ByteList bytes = new ByteList((byte[]) ((ArrayJavaProxy) self).getObject(), ascii8bit); return RubyString.newStringLight(context.runtime, bytes); } });
public static IRubyObject concatArraysDirect(ThreadContext context, Object original, IRubyObject additional) { final Ruby runtime = context.runtime; final int oldLength = Array.getLength(original); final int addLength = RubyFixnum.fix2int(Helpers.invoke(context, additional, "length")); ArrayJavaProxy proxy = ArrayUtils.newProxiedArray(runtime, original.getClass().getComponentType(), oldLength + addLength); System.arraycopy(original, 0, proxy.getObject(), 0, oldLength); for (int i = 0; i < addLength; i++) { IRubyObject val = Helpers.invoke(context, additional, "[]", runtime.newFixnum(i)); proxy.setValue(runtime, oldLength + i, val); // [ oldLen + i ] = val } return proxy; }
@JRubyMethod(name = "[]") public final IRubyObject op_aref(ThreadContext context, IRubyObject arg) { if ( arg instanceof RubyRange ) return arrayRange(context, (RubyRange) arg); final int i = convertArrayIndex(arg); return ArrayUtils.arefDirect(context.runtime, getObject(), converter, i); }
public JavaArray getJavaArray() { JavaArray javaArray = (JavaArray)dataGetStruct(); if (javaArray == null) { javaArray = new JavaArray(getRuntime(), getObject()); dataWrapStruct(javaArray); } return javaArray; }
@JRubyMethod(name = "[]", required = 1, rest = true) public IRubyObject op_aref(ThreadContext context, IRubyObject[] args) { if (args.length == 1 && args[0] instanceof RubyInteger) { int index = (int)((RubyInteger)args[0]).getLongValue(); return ArrayUtils.arefDirect(context.runtime, getObject(), converter, index); } else { return getRange(context, args); } }
@JRubyMethod public static IRubyObject to_s(ThreadContext context, IRubyObject self) { final Encoding ascii8bit = context.runtime.getEncodingService().getAscii8bitEncoding(); // All bytes can be considered raw strings and forced to particular codings if not 8bitascii ByteList bytes = new ByteList((byte[]) ((ArrayJavaProxy) self).getObject(), ascii8bit); return RubyString.newStringLight(context.runtime, bytes); }