/* This file is part of the db4o object database http://www.db4o.com
Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com
db4o is free software; you can redistribute it and/or modify it under
the terms of version 3 of the GNU General Public License as published
by the Free Software Foundation.
db4o is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see http://www.gnu.org/licenses/. */
package com.db4o.reflect.self;
import com.db4o.reflect.*;
public class SelfArray implements ReflectArray {
private final SelfReflectionRegistry _registry;
/** @param reflector */
SelfArray(Reflector reflector,SelfReflectionRegistry registry) {
_registry=registry;
}
public void analyze(Object obj, ArrayInfo info) {
// do nothing
}
public int[] dimensions(Object arr) {
return new int[]{getLength(arr)};
}
public int flatten(Object a_shaped, int[] a_dimensions,
int a_currentDimension, Object[] a_flat, int a_flatElement) {
if(a_shaped instanceof Object[]) {
Object[] shaped=(Object[])a_shaped;
System.arraycopy(shaped, 0, a_flat, 0, shaped.length);
return shaped.length;
}
return _registry.flattenArray(a_shaped,a_flat);
}
public Object get(Object onArray, int index) {
if(onArray instanceof Object[]) {
return ((Object[])onArray)[index];
}
return _registry.getArray(onArray,index);
}
public ReflectClass getComponentType(ReflectClass a_class) {
return ((SelfClass)a_class).getComponentType();
}
public int getLength(Object array) {
if(array instanceof Object[]) {
return ((Object[])array).length;
}
return _registry.arrayLength(array);
}
public boolean isNDimensional(ReflectClass a_class) {
return false;
}
public Object newInstance(ReflectClass componentType, ArrayInfo info) {
// TODO: implement multidimensional arrays.
int length = info.elementCount();
return newInstance(componentType, length);
}
public Object newInstance(ReflectClass componentType, int length) {
return _registry.arrayFor(((SelfClass)componentType).getJavaClass(),length);
}
public Object newInstance(ReflectClass componentType, int[] dimensions) {
return newInstance(componentType,dimensions[0]);
}
public void set(Object onArray, int index, Object element) {
if(onArray instanceof Object[]) {
((Object[])onArray)[index]=element;
return;
}
_registry.setArray(onArray,index,element);
}
public int shape(Object[] a_flat, int a_flatElement, Object a_shaped,
int[] a_dimensions, int a_currentDimension) {
if(a_shaped instanceof Object[]) {
Object[] shaped=(Object[])a_shaped;
System.arraycopy(a_flat, 0, shaped, 0, a_flat.length);
return a_flat.length;
}
return _registry.shapeArray(a_flat,a_shaped);
}
}