@JRubyMethod public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray, IRubyObject dims) { final Ruby runtime = context.runtime; if ( ! ( rubyArray instanceof RubyArray ) ) { return runtime.newEmptyArray(); } assert dims instanceof RubyArray; return calcDimensions(runtime, (RubyArray) rubyArray, (RubyArray) dims, 0); }
@JRubyMethod public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray, IRubyObject dims) { final Ruby runtime = context.runtime; if ( ! ( rubyArray instanceof RubyArray ) ) { return runtime.newEmptyArray(); } assert dims instanceof RubyArray; return calcDimensions(runtime, (RubyArray) rubyArray, (RubyArray) dims, 0); }
@JRubyMethod public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray, IRubyObject dims, IRubyObject index) { final Ruby runtime = context.runtime; if ( ! ( rubyArray instanceof RubyArray ) ) { return runtime.newEmptyArray(); } assert dims instanceof RubyArray; assert index instanceof RubyFixnum; final int i = (int) ((RubyFixnum) index).getLongValue(); return calcDimensions(runtime, (RubyArray) rubyArray, (RubyArray) dims, i); }
@JRubyMethod public static IRubyObject dimensions(ThreadContext context, IRubyObject rubyArray, IRubyObject dims, IRubyObject index) { final Ruby runtime = context.runtime; if ( ! ( rubyArray instanceof RubyArray ) ) { return runtime.newEmptyArray(); } assert dims instanceof RubyArray; assert index instanceof RubyFixnum; final int i = (int) ((RubyFixnum) index).getLongValue(); return calcDimensions(runtime, (RubyArray) rubyArray, (RubyArray) dims, i); }
private static RubyArray calcDimensions(final Ruby runtime, final RubyArray array, final RubyArray dims, final int index) { while ( dims.size() <= index ) { dims.append( RubyFixnum.zero(runtime) ); } final long dim = ((RubyFixnum) dims.eltInternal(index)).getLongValue(); if ( array.size() > dim ) { dims.eltInternalSet(index, RubyFixnum.newFixnum(runtime, array.size())); } for ( int i = 0; i < array.size(); i++ ) { final IRubyObject element = array.eltInternal(i); if ( element instanceof RubyArray ) { calcDimensions(runtime, (RubyArray) element, dims, 1); } } return dims; } }
private static RubyArray calcDimensions(final Ruby runtime, final RubyArray array, final RubyArray dims, final int index) { while ( dims.size() <= index ) { dims.append( RubyFixnum.zero(runtime) ); } final long dim = ((RubyFixnum) dims.eltInternal(index)).getLongValue(); if ( array.size() > dim ) { dims.eltInternalSet(index, RubyFixnum.newFixnum(runtime, array.size())); } for ( int i = 0; i < array.size(); i++ ) { final IRubyObject element = array.eltInternal(i); if ( element instanceof RubyArray ) { calcDimensions(runtime, (RubyArray) element, dims, 1); } } return dims; } }