001 /******************************************************************************* 002 * Copyright (c) 2009 Progress Software, Inc. 003 * Copyright (c) 2004, 2008 IBM Corporation and others. 004 * 005 * All rights reserved. This program and the accompanying materials 006 * are made available under the terms of the Eclipse Public License v1.0 007 * which accompanies this distribution, and is available at 008 * http://www.eclipse.org/legal/epl-v10.html 009 * 010 *******************************************************************************/ 011 package org.fusesource.hawtjni.generator.model; 012 013 /** 014 * 015 * @author <a href="http://hiramchirino.com">Hiram Chirino</a> 016 */ 017 public class ReflectType implements JNIType { 018 019 private Class<?> clazz; 020 021 public ReflectType(Class<?> clazz) { 022 this.clazz = clazz; 023 } 024 025 public int hashCode() { 026 return clazz.hashCode(); 027 } 028 029 public boolean equals(Object obj) { 030 if (obj == this) 031 return true; 032 if (!(obj instanceof ReflectType)) 033 return false; 034 return ((ReflectType) obj).clazz == clazz; 035 } 036 037 public Class<?> getWrappedClass() { 038 return clazz; 039 } 040 041 public ReflectType asType32(boolean allowConversion) { 042 if (allowConversion) { 043 if (clazz == long.class) 044 return new ReflectType(int.class); 045 else if (clazz == long[].class) 046 return new ReflectType(int[].class); 047 else if (clazz == double.class) 048 return new ReflectType(float.class); 049 else if (clazz == double[].class) 050 return new ReflectType(float[].class); 051 } 052 return this; 053 } 054 055 public ReflectType asType64(boolean allowConversion) { 056 if (allowConversion) { 057 if (clazz == int.class) 058 return new ReflectType(long.class); 059 else if (clazz == int[].class) 060 return new ReflectType(long[].class); 061 else if (clazz == float.class) 062 return new ReflectType(double.class); 063 else if (clazz == float[].class) 064 return new ReflectType(double[].class); 065 } 066 return this; 067 } 068 069 public JNIType getComponentType() { 070 return new ReflectType(clazz.getComponentType()); 071 } 072 073 public String getName() { 074 return clazz.getName(); 075 } 076 077 public String getSimpleName() { 078 return clazz.getSimpleName(); 079 } 080 081 public String getTypeSignature(boolean define) { 082 if (clazz == Void.TYPE) 083 return "V"; 084 if (clazz == Integer.TYPE) 085 return define ? "I_J" : "I"; 086 if (clazz == Boolean.TYPE) 087 return "Z"; 088 if (clazz == Long.TYPE) 089 return define ? "J_J" : "J"; 090 if (clazz == Short.TYPE) 091 return "S"; 092 if (clazz == Character.TYPE) 093 return "C"; 094 if (clazz == Byte.TYPE) 095 return "B"; 096 if (clazz == Float.TYPE) 097 return define ? "F_D" : "F"; 098 if (clazz == Double.TYPE) 099 return define ? "F_D" : "D"; 100 if (clazz == String.class) 101 return "Ljava/lang/String;"; 102 if (clazz.isArray()) { 103 if (define) 104 return getComponentType().getTypeSignature(define) + "Array"; 105 return "[" + getComponentType().getTypeSignature(define); 106 } 107 return "L" + clazz.getName().replace('.', '/') + ";"; 108 } 109 110 public String getTypeSignature1(boolean define) { 111 if (clazz == Void.TYPE) 112 return "Void"; 113 if (clazz == Integer.TYPE) 114 return define ? "IntLong" : "Int"; 115 if (clazz == Boolean.TYPE) 116 return "Boolean"; 117 if (clazz == Long.TYPE) 118 return define ? "IntLong" : "Long"; 119 if (clazz == Short.TYPE) 120 return "Short"; 121 if (clazz == Character.TYPE) 122 return "Char"; 123 if (clazz == Byte.TYPE) 124 return "Byte"; 125 if (clazz == Float.TYPE) 126 return define ? "FloatDouble" : "Float"; 127 if (clazz == Double.TYPE) 128 return define ? "FloatDouble" : "Double"; 129 if (clazz == String.class) 130 return "String"; 131 return "Object"; 132 } 133 134 public String getTypeSignature2(boolean define) { 135 if (clazz == Void.TYPE) 136 return "void"; 137 if (clazz == Integer.TYPE) 138 return define ? "jintLong" : "jint"; 139 if (clazz == Boolean.TYPE) 140 return "jboolean"; 141 if (clazz == Long.TYPE) 142 return define ? "jintLong" : "jlong"; 143 if (clazz == Short.TYPE) 144 return "jshort"; 145 if (clazz == Character.TYPE) 146 return "jchar"; 147 if (clazz == Byte.TYPE) 148 return "jbyte"; 149 if (clazz == Float.TYPE) 150 return define ? "jfloatDouble" : "jfloat"; 151 if (clazz == Double.TYPE) 152 return define ? "jfloatDouble" : "jdouble"; 153 if (clazz == String.class) 154 return "jstring"; 155 if (clazz == Class.class) 156 return "jclass"; 157 if (clazz.isArray()) { 158 return getComponentType().getTypeSignature2(define) + "Array"; 159 } 160 return "jobject"; 161 } 162 163 public String getTypeSignature3(boolean define) { 164 if (clazz == Void.TYPE) 165 return "void"; 166 if (clazz == Integer.TYPE) 167 return "int"; 168 if (clazz == Boolean.TYPE) 169 return "boolean"; 170 if (clazz == Long.TYPE) 171 return "long"; 172 if (clazz == Short.TYPE) 173 return "short"; 174 if (clazz == Character.TYPE) 175 return "char"; 176 if (clazz == Byte.TYPE) 177 return "byte"; 178 if (clazz == Float.TYPE) 179 return "float"; 180 if (clazz == Double.TYPE) 181 return "double"; 182 if (clazz == String.class) 183 return "String"; 184 if (clazz.isArray()) { 185 return getComponentType().getTypeSignature3(define) + "[]"; 186 } 187 return clazz.getName(); 188 } 189 190 public String getTypeSignature4(boolean define, boolean struct) { 191 if (clazz == Void.TYPE) 192 return "void"; 193 if (clazz == Integer.TYPE) 194 return define ? "jintLong" : "jint"; 195 if (clazz == Boolean.TYPE) 196 return "jboolean"; 197 if (clazz == Long.TYPE) 198 return define ? "jintLong" : "jlong"; 199 if (clazz == Short.TYPE) 200 return "jshort"; 201 if (clazz == Character.TYPE) 202 return "jchar"; 203 if (clazz == Byte.TYPE) 204 return "jbyte"; 205 if (clazz == Float.TYPE) 206 return define ? "jfloatDouble" : "jfloat"; 207 if (clazz == Double.TYPE) 208 return define ? "jfloatDouble" : "jdouble"; 209 if (clazz == String.class) 210 return "jstring"; 211 if (clazz.isArray()) { 212 String sig = getComponentType().getTypeSignature4(define, struct); 213 return struct ? sig : sig + " *"; 214 } 215 String sig = getSimpleName(); 216 return struct ? sig : sig + " *"; 217 } 218 219 public boolean isArray() { 220 return clazz.isArray(); 221 } 222 223 public boolean isPrimitive() { 224 return clazz.isPrimitive(); 225 } 226 227 public boolean isType(String type) { 228 return clazz.getName().equals(type); 229 } 230 231 }