X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.utils.datastructures%2Fsrc%2Forg%2Fsimantics%2Futils%2Fdatastructures%2FValueUtils.java;fp=bundles%2Forg.simantics.utils.datastructures%2Fsrc%2Forg%2Fsimantics%2Futils%2Fdatastructures%2FValueUtils.java;h=fd41134d16339e0f0cf1cd65264bf1e639993e22;hb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;hp=0c0dc0dc6b6dcd32c99fb152bca3de68f61fabf6;hpb=24e2b34260f219f0d1644ca7a138894980e25b14;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java b/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java index 0c0dc0dc6..fd41134d1 100644 --- a/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java +++ b/bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/ValueUtils.java @@ -1,1683 +1,1683 @@ -/******************************************************************************* - * Copyright (c) 2007, 2010 Association for Decentralized Information Management - * in Industry THTH ry. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * VTT Technical Research Centre of Finland - initial API and implementation - *******************************************************************************/ -package org.simantics.utils.datastructures; - -import java.io.DataInput; -import java.io.DataOutput; -import java.io.IOException; -import java.lang.reflect.Array; -import java.security.InvalidParameterException; -import java.util.Arrays; -import java.util.Calendar; - -/** - * Object type casting tools. - * - * @author Toni Kalajainen - * @author Hannu Niemistö - */ -public class ValueUtils { - - /** - * Convert double value to a number class. - * - * @param value - * @param numberClass - * @return - * @throws ClassCastException - */ - public static Number doubleToNumberClass(double value, Class numberClass) - throws ClassCastException - { - if (numberClass==Integer.class) - return (int)value; - if (numberClass==Byte.class) - return (byte)value; - if (numberClass==Float.class) - return (float)value; - if (numberClass==Short.class) - return (short)value; - if (numberClass==Long.class) - return (long)value; - if (numberClass==Double.class) - return (double)value; - throw new ClassCastException("Cannot convert to "+numberClass.getName()); - } - - /** - * Possible object types: - * - */ - - static final Boolean True = new Boolean(true); - static final Boolean False = new Boolean(false); - - public static void serialize(DataOutput stream, Object obj) throws IOException { - try { - Class clazz = obj.getClass(); - if(clazz.isArray()) { - if(obj instanceof double[]) { - double[] array = (double[])obj; - stream.writeByte(16); - stream.writeInt(array.length); - for(double v : array) - stream.writeDouble(v); - } - else if(obj instanceof float[]) { - float[] array = (float[])obj; - stream.writeByte(15); - stream.writeInt(array.length); - for(float v : array) - stream.writeFloat(v); - } - else if(obj instanceof int[]) { - int[] array = (int[])obj; - stream.writeByte(13); - stream.writeInt(array.length); - for(int v : array) - stream.writeInt(v); - } - else if(obj instanceof String[]) { - String[] array = (String[])obj; - stream.writeByte(17); - stream.writeInt(array.length); - for(String v : array) - stream.writeUTF(v); - } - else if(obj instanceof boolean[]) { - boolean[] array = (boolean[])obj; - stream.writeByte(11); - stream.writeInt(array.length); - for(boolean v : array) - stream.writeByte(v ? (byte)1 : (byte)0); - } - else if(obj instanceof byte[]) { - byte[] array = (byte[])obj; - stream.writeByte(12); - stream.writeInt(array.length); - for(byte v : array) - stream.writeByte(v); - } - else if(obj instanceof long[]) { - long[] array = (long[])obj; - stream.writeByte(14); - stream.writeInt(array.length); - for(long v : array) - stream.writeLong(v); - } - else { - System.out.println("ValueUtils.serialize failed (invalid type)."); - throw new InvalidParameterException(); - } - } - else { - if(clazz == Double.class) { - stream.writeByte(6); - stream.writeDouble((Double)obj); - } - else if(clazz == Float.class) { - stream.writeByte(5); - stream.writeDouble((Float)obj); - } - else if(clazz == Integer.class) { - stream.writeByte(3); - stream.writeInt((Integer)obj); - } - else if(clazz == String.class) { - stream.writeByte(7); - stream.writeUTF((String)obj); - } - else if(clazz == Boolean.class) { - stream.writeByte((Boolean)obj ? 1 : 0); - } - else if(clazz == Byte.class) { - stream.writeByte(2); - stream.writeByte((Byte)obj); - } - else if(clazz == Long.class) { - stream.writeByte(4); - stream.writeLong((Long)obj); - } - else { - System.out.println("ValueUtils.serialize failed (invalid type)."); - throw new InvalidParameterException(); - } - } - } catch(IOException e) { - System.out.println("ValueUtils.serialize failed (write failure)."); - e.printStackTrace(); - throw e; - } - } - - public static Object deserialize(DataInput stream) throws IOException { - try { - byte typeCode = stream.readByte(); - switch(typeCode) { - case 0: return False; - case 1: return True; - case 2: return stream.readByte(); - case 3: return stream.readInt(); - case 4: return stream.readLong(); - case 5: return stream.readFloat(); - case 6: return stream.readDouble(); - case 7: return stream.readUTF(); - - case 11: { - int length = stream.readInt(); - boolean[] value = new boolean[length]; - for(int i=0;i T adaptToClass(Object obj, Class clazz) - throws TypeCastException - { - if (clazz.equals(double[].class)) - return (T) toDoubleArray(obj); - if (clazz.equals(Double.class)) - return (T) new Double(toDoubleScalar(obj)); - - if (clazz.equals(float[].class)) - return (T) toFloatArray(obj); - if (clazz.equals(Float.class)) - return (T) new Float(toFloatScalar(obj)); - - if (clazz.equals(long[].class)) - return (T) toLongArray(obj); - if (clazz.equals(Long.class)) - return (T) new Long(toLongScalar(obj)); - - if (clazz.equals(int[].class)) - return (T) toIntegerArray(obj); - if (clazz.equals(Integer.class)) - return (T) new Integer(toIntegerScalar(obj)); - - if (clazz.equals(boolean[].class)) - return (T) toBooleanArray(obj); - if (clazz.equals(Boolean.class)) - return (T) new Long(toLongScalar(obj)); - - throw new TypeCastException("Unsupported conversion type from "+obj.getClass()+" to "+clazz); - } - - - - public static String toString(Object obj) { - if (obj instanceof Object[]) { - return Arrays.toString((Object[])obj); - } - if (obj instanceof double[]) return Arrays.toString((double[])obj); - if (obj instanceof boolean[]) return Arrays.toString((boolean[])obj); - if (obj instanceof byte[]) return Arrays.toString((byte[])obj); - if (obj instanceof char[]) return Arrays.toString((char[])obj); - if (obj instanceof float[]) return Arrays.toString((float[])obj); - if (obj instanceof int[]) return Arrays.toString((int[])obj); - if (obj instanceof long[]) return Arrays.toString((long[])obj); - if (obj instanceof short[]) return Arrays.toString((short[])obj); - return obj.toString(); - } -} +/******************************************************************************* + * Copyright (c) 2007, 2010 Association for Decentralized Information Management + * in Industry THTH ry. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * VTT Technical Research Centre of Finland - initial API and implementation + *******************************************************************************/ +package org.simantics.utils.datastructures; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.lang.reflect.Array; +import java.security.InvalidParameterException; +import java.util.Arrays; +import java.util.Calendar; + +/** + * Object type casting tools. + * + * @author Toni Kalajainen + * @author Hannu Niemistö + */ +public class ValueUtils { + + /** + * Convert double value to a number class. + * + * @param value + * @param numberClass + * @return + * @throws ClassCastException + */ + public static Number doubleToNumberClass(double value, Class numberClass) + throws ClassCastException + { + if (numberClass==Integer.class) + return (int)value; + if (numberClass==Byte.class) + return (byte)value; + if (numberClass==Float.class) + return (float)value; + if (numberClass==Short.class) + return (short)value; + if (numberClass==Long.class) + return (long)value; + if (numberClass==Double.class) + return (double)value; + throw new ClassCastException("Cannot convert to "+numberClass.getName()); + } + + /** + * Possible object types: + * + */ + + static final Boolean True = new Boolean(true); + static final Boolean False = new Boolean(false); + + public static void serialize(DataOutput stream, Object obj) throws IOException { + try { + Class clazz = obj.getClass(); + if(clazz.isArray()) { + if(obj instanceof double[]) { + double[] array = (double[])obj; + stream.writeByte(16); + stream.writeInt(array.length); + for(double v : array) + stream.writeDouble(v); + } + else if(obj instanceof float[]) { + float[] array = (float[])obj; + stream.writeByte(15); + stream.writeInt(array.length); + for(float v : array) + stream.writeFloat(v); + } + else if(obj instanceof int[]) { + int[] array = (int[])obj; + stream.writeByte(13); + stream.writeInt(array.length); + for(int v : array) + stream.writeInt(v); + } + else if(obj instanceof String[]) { + String[] array = (String[])obj; + stream.writeByte(17); + stream.writeInt(array.length); + for(String v : array) + stream.writeUTF(v); + } + else if(obj instanceof boolean[]) { + boolean[] array = (boolean[])obj; + stream.writeByte(11); + stream.writeInt(array.length); + for(boolean v : array) + stream.writeByte(v ? (byte)1 : (byte)0); + } + else if(obj instanceof byte[]) { + byte[] array = (byte[])obj; + stream.writeByte(12); + stream.writeInt(array.length); + for(byte v : array) + stream.writeByte(v); + } + else if(obj instanceof long[]) { + long[] array = (long[])obj; + stream.writeByte(14); + stream.writeInt(array.length); + for(long v : array) + stream.writeLong(v); + } + else { + System.out.println("ValueUtils.serialize failed (invalid type)."); + throw new InvalidParameterException(); + } + } + else { + if(clazz == Double.class) { + stream.writeByte(6); + stream.writeDouble((Double)obj); + } + else if(clazz == Float.class) { + stream.writeByte(5); + stream.writeDouble((Float)obj); + } + else if(clazz == Integer.class) { + stream.writeByte(3); + stream.writeInt((Integer)obj); + } + else if(clazz == String.class) { + stream.writeByte(7); + stream.writeUTF((String)obj); + } + else if(clazz == Boolean.class) { + stream.writeByte((Boolean)obj ? 1 : 0); + } + else if(clazz == Byte.class) { + stream.writeByte(2); + stream.writeByte((Byte)obj); + } + else if(clazz == Long.class) { + stream.writeByte(4); + stream.writeLong((Long)obj); + } + else { + System.out.println("ValueUtils.serialize failed (invalid type)."); + throw new InvalidParameterException(); + } + } + } catch(IOException e) { + System.out.println("ValueUtils.serialize failed (write failure)."); + e.printStackTrace(); + throw e; + } + } + + public static Object deserialize(DataInput stream) throws IOException { + try { + byte typeCode = stream.readByte(); + switch(typeCode) { + case 0: return False; + case 1: return True; + case 2: return stream.readByte(); + case 3: return stream.readInt(); + case 4: return stream.readLong(); + case 5: return stream.readFloat(); + case 6: return stream.readDouble(); + case 7: return stream.readUTF(); + + case 11: { + int length = stream.readInt(); + boolean[] value = new boolean[length]; + for(int i=0;i T adaptToClass(Object obj, Class clazz) + throws TypeCastException + { + if (clazz.equals(double[].class)) + return (T) toDoubleArray(obj); + if (clazz.equals(Double.class)) + return (T) new Double(toDoubleScalar(obj)); + + if (clazz.equals(float[].class)) + return (T) toFloatArray(obj); + if (clazz.equals(Float.class)) + return (T) new Float(toFloatScalar(obj)); + + if (clazz.equals(long[].class)) + return (T) toLongArray(obj); + if (clazz.equals(Long.class)) + return (T) new Long(toLongScalar(obj)); + + if (clazz.equals(int[].class)) + return (T) toIntegerArray(obj); + if (clazz.equals(Integer.class)) + return (T) new Integer(toIntegerScalar(obj)); + + if (clazz.equals(boolean[].class)) + return (T) toBooleanArray(obj); + if (clazz.equals(Boolean.class)) + return (T) new Long(toLongScalar(obj)); + + throw new TypeCastException("Unsupported conversion type from "+obj.getClass()+" to "+clazz); + } + + + + public static String toString(Object obj) { + if (obj instanceof Object[]) { + return Arrays.toString((Object[])obj); + } + if (obj instanceof double[]) return Arrays.toString((double[])obj); + if (obj instanceof boolean[]) return Arrays.toString((boolean[])obj); + if (obj instanceof byte[]) return Arrays.toString((byte[])obj); + if (obj instanceof char[]) return Arrays.toString((char[])obj); + if (obj instanceof float[]) return Arrays.toString((float[])obj); + if (obj instanceof int[]) return Arrays.toString((int[])obj); + if (obj instanceof long[]) return Arrays.toString((long[])obj); + if (obj instanceof short[]) return Arrays.toString((short[])obj); + return obj.toString(); + } +}