aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/gluegen/cgram
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2015-03-09 02:45:21 +0100
committerSven Gothel <[email protected]>2015-03-09 02:45:21 +0100
commitcf9f28cf249393f42d7d2835775521dfadee6b92 (patch)
tree4afb150bd89dca1be3cd27d3632487cbfdcd06c4 /src/java/com/jogamp/gluegen/cgram
parent3b7871515f9a6a3c7adcbf12772d168e61f86d50 (diff)
Bug 1134 - Fix IntType 'unsigned'; Type: Use copy-ctor instead of Clonable, ..
- Fix IntType 'unsigned' - Need to handle 'unsigned' for typedef and !typedef, when exposing 'unsigned' for code emission. - Consider IntType.typedefUnsigned in hash/equals - Type: Use copy-ctor instead of Clonable enhancing strong typing. - add 'Type clone(final ASTLocusTag newLoc)' - Consider Type.typedefCVAttributes in hash/equals
Diffstat (limited to 'src/java/com/jogamp/gluegen/cgram')
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/AliasedSymbol.java5
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/ArrayType.java21
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/BitType.java37
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/CompoundType.java53
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/DoubleType.java18
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/EnumType.java45
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/FloatType.java18
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java2
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/FunctionType.java40
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/IntType.java67
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/MemoryLayoutType.java4
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/PointerType.java25
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/PrimitiveType.java4
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/StructType.java20
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/Type.java108
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/TypeVisitor.java6
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/UnionType.java20
-rw-r--r--src/java/com/jogamp/gluegen/cgram/types/VoidType.java16
18 files changed, 273 insertions, 236 deletions
diff --git a/src/java/com/jogamp/gluegen/cgram/types/AliasedSymbol.java b/src/java/com/jogamp/gluegen/cgram/types/AliasedSymbol.java
index 679d44d..73c65ef 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/AliasedSymbol.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/AliasedSymbol.java
@@ -107,6 +107,11 @@ public interface AliasedSymbol {
this.aliasedNames=new HashSet<String>();
this.name = origName;
}
+ public AliasedSymbolImpl(final AliasedSymbolImpl o) {
+ this.origName = o.origName;
+ this.aliasedNames = new HashSet<String>(o.aliasedNames);
+ this.name = o.origName;
+ }
@Override
public void rename(final String newName) {
if( null != newName && !name.equals(newName) ) {
diff --git a/src/java/com/jogamp/gluegen/cgram/types/ArrayType.java b/src/java/com/jogamp/gluegen/cgram/types/ArrayType.java
index cabbcc1..ada34f7 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/ArrayType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/ArrayType.java
@@ -61,6 +61,16 @@ public class ArrayType extends MemoryLayoutType implements Cloneable {
this.elementType = elementType;
this.length = length;
}
+ private ArrayType(final ArrayType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ elementType = o.elementType;
+ length = o.length;
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new ArrayType(this, cvAttributes, astLocus);
+ }
@Override
protected int hashCodeImpl() {
@@ -91,7 +101,7 @@ public class ArrayType extends MemoryLayoutType implements Cloneable {
}
@Override
- public boolean hasName() { return null != elementType.getName(); }
+ public boolean isAnon() { return elementType.isAnon(); }
@Override
public String getName(final boolean includeCVAttrs) {
@@ -151,13 +161,4 @@ public class ArrayType extends MemoryLayoutType implements Cloneable {
super.visit(arg);
elementType.visit(arg);
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new ArrayType(elementType, getSize(), length, cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/BitType.java b/src/java/com/jogamp/gluegen/cgram/types/BitType.java
index b7488ea..834ff95 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/BitType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/BitType.java
@@ -57,10 +57,23 @@ public class BitType extends IntType implements Cloneable {
this.offset = lsbOffset;
}
+ private BitType(final BitType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ underlyingType = o.underlyingType;
+ sizeInBits = o.sizeInBits;
+ offset = o.offset;
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new BitType(this, cvAttributes, astLocus);
+ }
+
@Override
protected int hashCodeImpl() {
// 31 * x == (x << 5) - x
- int hash = underlyingType.hashCode();
+ int hash = super.hashCodeImpl();
+ hash = ((hash << 5) - hash) + underlyingType.hashCode();
hash = ((hash << 5) - hash) + sizeInBits;
return ((hash << 5) - hash) + offset;
}
@@ -68,7 +81,8 @@ public class BitType extends IntType implements Cloneable {
@Override
protected boolean equalsImpl(final Type arg) {
final BitType t = (BitType) arg;
- return underlyingType.equals(t.underlyingType) &&
+ return super.equalsImpl(arg) &&
+ underlyingType.equals(t.underlyingType) &&
sizeInBits == t.sizeInBits &&
offset == t.offset;
}
@@ -76,7 +90,8 @@ public class BitType extends IntType implements Cloneable {
@Override
protected int hashCodeSemanticsImpl() {
// 31 * x == (x << 5) - x
- int hash = underlyingType.hashCodeSemantics();
+ int hash = super.hashCodeSemanticsImpl();
+ hash = ((hash << 5) - hash) + underlyingType.hashCodeSemantics();
hash = ((hash << 5) - hash) + sizeInBits;
return ((hash << 5) - hash) + offset;
}
@@ -84,9 +99,10 @@ public class BitType extends IntType implements Cloneable {
@Override
protected boolean equalSemanticsImpl(final Type arg) {
final BitType t = (BitType) arg;
- return underlyingType.equalSemantics(t.underlyingType) &&
- sizeInBits == t.sizeInBits &&
- offset == t.offset;
+ return super.equalSemanticsImpl(arg) &&
+ underlyingType.equalSemantics(t.underlyingType) &&
+ sizeInBits == t.sizeInBits &&
+ offset == t.offset;
}
@Override
@@ -108,13 +124,4 @@ public class BitType extends IntType implements Cloneable {
super.visit(arg);
underlyingType.visit(arg);
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new BitType(underlyingType, sizeInBits, offset, cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/CompoundType.java b/src/java/com/jogamp/gluegen/cgram/types/CompoundType.java
index dc5becf..56bcdda 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/CompoundType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/CompoundType.java
@@ -54,18 +54,6 @@ public abstract class CompoundType extends MemoryLayoutType implements Cloneable
private ArrayList<Field> fields;
private boolean visiting;
private boolean bodyParsed;
- /**
- *
- * @param name
- * @param size
- * @param cvAttributes
- * @param structName
- */
- CompoundType(final String name, final SizeThunk size, final int cvAttributes,
- final String structName, final ASTLocusTag astLocus) {
- super(name, size, cvAttributes, astLocus);
- this.structName = structName;
- }
@Override
public void rename(final String newName) {
@@ -117,13 +105,19 @@ public abstract class CompoundType extends MemoryLayoutType implements Cloneable
return res;
}
- @Override
- public Object clone() {
- final CompoundType n = (CompoundType) super.clone();
- if(null!=this.fields) {
- n.fields = new ArrayList<Field>(this.fields);
+ CompoundType(final String name, final SizeThunk size, final int cvAttributes,
+ final String structName, final ASTLocusTag astLocus) {
+ super(null == name ? structName : name, size, cvAttributes, astLocus);
+ this.structName = structName;
+ }
+
+ CompoundType(final CompoundType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ this.structName = o.structName;
+ if(null != o.fields) {
+ fields = new ArrayList<Field>(o.fields);
}
- return n;
+ bodyParsed = o.bodyParsed;
}
@Override
@@ -200,30 +194,13 @@ public abstract class CompoundType extends MemoryLayoutType implements Cloneable
/**
* Indicates to this CompoundType that its body has been parsed and
* that no more {@link #addField} operations will be made.
- * <p>
- * If {@code evalStructTypeName} is {@code true}, {@link #evalStructTypeName()} is performed.
- * </p>
* @throws IllegalStateException If called twice.
*/
- public void setBodyParsed(final boolean evalStructTypeName) throws IllegalStateException {
+ public void setBodyParsed() throws IllegalStateException {
if (bodyParsed) {
throw new IllegalStateException("Body of this CompoundType has been already closed");
}
bodyParsed = true;
- if( evalStructTypeName ) {
- evalStructTypeName();
- }
- }
- public boolean isBodyParsed() { return bodyParsed; }
- /**
- * {@link #getName() name} is set to {@link #getStructName() struct-name},
- * which promotes this instance for emission by its struct-name.
- */
- public Type evalStructTypeName() {
- if( null == getName() ) {
- setName(structName);
- }
- return this;
}
/** Indicates whether this type was declared as a struct. */
@@ -254,12 +231,12 @@ public abstract class CompoundType extends MemoryLayoutType implements Cloneable
super.visit(arg);
final int n = getNumFields();
for (int i = 0; i < n; i++) {
- final Field f = getField(i);
- f.getType().visit(arg);
+ getField(i).getType().visit(arg);
}
} finally {
visiting = false;
}
+ return;
}
public String getStructString() {
diff --git a/src/java/com/jogamp/gluegen/cgram/types/DoubleType.java b/src/java/com/jogamp/gluegen/cgram/types/DoubleType.java
index 7bcf767..133a322 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/DoubleType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/DoubleType.java
@@ -48,6 +48,15 @@ public class DoubleType extends PrimitiveType implements Cloneable {
super(name, size, cvAttributes, astLocus);
}
+ private DoubleType(final DoubleType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new DoubleType(this, cvAttributes, astLocus);
+ }
+
@Override
public DoubleType asDouble() {
return this;
@@ -72,13 +81,4 @@ public class DoubleType extends PrimitiveType implements Cloneable {
protected boolean equalSemanticsImpl(final Type t) {
return true;
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new DoubleType(getName(), getSize(), cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/EnumType.java b/src/java/com/jogamp/gluegen/cgram/types/EnumType.java
index 47691cd..f49c2ec 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/EnumType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/EnumType.java
@@ -50,8 +50,6 @@ import com.jogamp.gluegen.cgram.types.TypeComparator.SemanticEqualityOp;
they have a set of named values. */
public class EnumType extends IntType implements Cloneable {
- private IntType underlyingType;
-
private static class Enum implements TypeComparator.SemanticEqualityOp {
final String name;
final long value;
@@ -101,6 +99,7 @@ public class EnumType extends IntType implements Cloneable {
public String toString() { return name+" = "+value; }
}
+ private final IntType underlyingType;
private ArrayList<Enum> enums;
public EnumType(final String name) {
@@ -113,48 +112,48 @@ public class EnumType extends IntType implements Cloneable {
this.underlyingType = new IntType(name, enumSizeInBytes, false, CVAttributes.CONST, astLocus);
}
- protected EnumType(final String name, final IntType underlyingType, final int cvAttributes, final ASTLocusTag astLocus) {
- super(name, underlyingType.getSize(), underlyingType.isUnsigned(), cvAttributes, astLocus);
- this.underlyingType = underlyingType;
+ private EnumType(final EnumType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ underlyingType = o.underlyingType;
+ if(null != o.enums) {
+ enums = new ArrayList<Enum>(o.enums);
+ }
}
@Override
- public Object clone() {
- final EnumType n = (EnumType) super.clone();
- if(null!=this.underlyingType) {
- n.underlyingType = (IntType) this.underlyingType.clone();
- }
- if(null!=this.enums) {
- n.enums = new ArrayList<Enum>(this.enums);
- }
- return n;
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new EnumType(this, cvAttributes, astLocus);
}
@Override
protected int hashCodeImpl() {
// 31 * x == (x << 5) - x
- final int hash = underlyingType.hashCode();
+ int hash = super.hashCodeImpl();
+ hash = ((hash << 5) - hash) + underlyingType.hashCode();
return ((hash << 5) - hash) + TypeComparator.listsHashCode(enums);
}
@Override
protected boolean equalsImpl(final Type arg) {
final EnumType t = (EnumType) arg;
- return underlyingType.equals(t.underlyingType) &&
+ return super.equalsImpl(arg) &&
+ underlyingType.equals(t.underlyingType) &&
TypeComparator.listsEqual(enums, t.enums);
}
@Override
protected int hashCodeSemanticsImpl() {
// 31 * x == (x << 5) - x
- final int hash = underlyingType.hashCodeSemantics();
+ int hash = super.hashCodeSemanticsImpl();
+ hash = ((hash << 5) - hash) + underlyingType.hashCodeSemantics();
return ((hash << 5) - hash) + TypeComparator.listsHashCodeSemantics(enums);
}
@Override
protected boolean equalSemanticsImpl(final Type arg) {
final EnumType t = (EnumType) arg;
- return underlyingType.equalSemantics(t.underlyingType) &&
+ return super.equalSemanticsImpl(arg) &&
+ underlyingType.equalSemantics(t.underlyingType) &&
TypeComparator.listsEqualSemantics(enums, t.enums);
}
@@ -242,14 +241,4 @@ public class EnumType extends IntType implements Cloneable {
super.visit(arg);
underlyingType.visit(arg);
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- final EnumType t = new EnumType(getName(), underlyingType, cvAttributes, astLocus);
- t.enums = enums;
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/FloatType.java b/src/java/com/jogamp/gluegen/cgram/types/FloatType.java
index 2632409..2e7a2cf 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/FloatType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/FloatType.java
@@ -49,6 +49,15 @@ public class FloatType extends PrimitiveType implements Cloneable {
super(name, size, cvAttributes, astLocus);
}
+ private FloatType(final FloatType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new FloatType(this, cvAttributes, astLocus);
+ }
+
@Override
public FloatType asFloat() { return this; }
@@ -71,13 +80,4 @@ public class FloatType extends PrimitiveType implements Cloneable {
protected boolean equalSemanticsImpl(final Type t) {
return true;
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new FloatType(getName(), getSize(), cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java b/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java
index 2b78e8c..55585fc 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/FunctionSymbol.java
@@ -113,7 +113,7 @@ public class FunctionSymbol extends AliasedSymbolImpl implements AliasedSemantic
@Override
public String toString() {
- return getType().toString(getName());
+ return getType().toString(getName(), false);
}
/** Helper routine for emitting native javadoc tags */
diff --git a/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java b/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java
index 7ccc4c0..2b9dec7 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/FunctionType.java
@@ -61,16 +61,25 @@ public class FunctionType extends Type implements Cloneable {
this.returnType = returnType;
}
- @Override
- public Object clone() {
- final FunctionType n = (FunctionType) super.clone();
- if(null!=this.argumentTypes) {
- n.argumentTypes = new ArrayList<Type>(this.argumentTypes);
+ private FunctionType(final FunctionType o, final ASTLocusTag astLocus) {
+ super(o, o.getCVAttributes(), astLocus);
+ returnType = o.returnType;
+ if(null != o.argumentTypes) {
+ argumentTypes = new ArrayList<Type>(o.argumentTypes);
+ }
+ if(null != o.argumentNames) {
+ argumentNames = new ArrayList<String>(o.argumentNames);
}
- if(null!=this.argumentNames) {
- n.argumentNames = new ArrayList<String>(this.argumentNames);
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ if( newCVVariant ) {
+ // Functions don't have const/volatile attributes
+ return this;
+ } else {
+ return new FunctionType(this, astLocus);
}
- return n;
}
@Override
@@ -146,18 +155,15 @@ public class FunctionType extends Type implements Cloneable {
@Override
public String toString() {
- return toString(null);
- }
-
- public String toString(final String functionName) {
- return toString(functionName, false);
+ return toString(null, false);
}
public String toString(final String functionName, final boolean emitNativeTag) {
return toString(functionName, null, emitNativeTag, false);
}
- String toString(final String functionName, final String callingConvention, final boolean emitNativeTag, final boolean isPointer) {
+ String toString(final String functionName, final String callingConvention,
+ final boolean emitNativeTag, final boolean isPointer) {
final StringBuilder res = new StringBuilder();
res.append(getReturnType().getCName(true));
res.append(" ");
@@ -216,10 +222,4 @@ public class FunctionType extends Type implements Cloneable {
getArgumentType(i).visit(arg);
}
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- // Functions don't have const/volatile attributes
- return this;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/IntType.java b/src/java/com/jogamp/gluegen/cgram/types/IntType.java
index fd2509e..2433fc6 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/IntType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/IntType.java
@@ -44,6 +44,7 @@ import com.jogamp.gluegen.ASTLocusTag;
public class IntType extends PrimitiveType implements Cloneable {
private final boolean unsigned;
+ private boolean typedefUnsigned;
public IntType(final String name, final SizeThunk size, final boolean unsigned, final int cvAttributes) {
this(name, size, unsigned, cvAttributes, null);
@@ -54,42 +55,79 @@ public class IntType extends PrimitiveType implements Cloneable {
final ASTLocusTag astLocus) {
super(name, size, cvAttributes, astLocus);
this.unsigned = unsigned;
+ this.typedefUnsigned = false;
}
- /** Only for HeaderParser */
+ /**
+ * Only for HeaderParser!
+ *
+ * @param name the name
+ * @param size the size
+ * @param unsigned true if this instance is unsigned, not the <i>typedef</i>!
+ * @param cvAttributes the cvAttributes for this instance, not for the <i>typedef</i>!
+ * @param isTypedef true if this instance is a <i>typedef</i> variant
+ * @param typedefUnsigned true if the <i>typedef</i> itself is unsigned
+ * @param astLocus the location in source code
+ */
public IntType(final String name, final SizeThunk size,
final boolean unsigned, final int cvAttributes,
- final boolean isTypedef,
+ final boolean isTypedef, final boolean typedefUnsigned,
final ASTLocusTag astLocus) {
super(name, size, cvAttributes, astLocus);
this.unsigned = unsigned;
if( isTypedef ) {
- setTypedef(cvAttributes);
+ // the 'cvAttributes' are intended for this instance, not the 'typedef cvAttributes'!
+ setTypedef(0);
+ this.typedefUnsigned = typedefUnsigned;
+ } else {
+ this.typedefUnsigned = false;
}
}
+ IntType(final IntType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ this.unsigned = o.unsigned;
+ this.typedefUnsigned = o.typedefUnsigned;
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new IntType(this, cvAttributes, astLocus);
+ }
+
@Override
protected int hashCodeImpl() {
// 31 * x == (x << 5) - x
- return 31 + ( unsigned ? 1 : 0 );
+ int hash = 1;
+ hash = ((hash << 5) - hash) + ( unsigned ? 1 : 0 );
+ return ((hash << 5) - hash) + ( typedefUnsigned ? 1 : 0 );
}
@Override
protected boolean equalsImpl(final Type arg) {
final IntType t = (IntType) arg;
- return unsigned == t.unsigned;
+ return unsigned == t.unsigned &&
+ typedefUnsigned == t.typedefUnsigned;
}
@Override
protected int hashCodeSemanticsImpl() {
- return hashCodeImpl();
+ // 31 * x == (x << 5) - x
+ int hash = 1;
+ if( !relaxedEqSem ) {
+ hash = ((hash << 5) - hash) + ( unsigned ? 1 : 0 );
+ hash = ((hash << 5) - hash) + ( typedefUnsigned ? 1 : 0 );
+ }
+ return hash;
}
@Override
protected boolean equalSemanticsImpl(final Type arg) {
final IntType t = (IntType) arg;
return relaxedEqSem ||
- unsigned == t.unsigned;
+ ( unsigned == t.unsigned &&
+ typedefUnsigned == t.typedefUnsigned
+ );
}
@Override
@@ -104,7 +142,7 @@ public class IntType extends PrimitiveType implements Cloneable {
@Override
public String getCName(final boolean includeCVAttrs) {
- if ( isTypedef() || !isUnsigned() ) {
+ if ( !unsigned || typedefUnsigned ) {
return super.getCName(includeCVAttrs);
} else {
return "unsigned "+super.getCName(includeCVAttrs);
@@ -113,15 +151,16 @@ public class IntType extends PrimitiveType implements Cloneable {
@Override
public String toString() {
- return getCVAttributesString() + ( isUnsigned() && !isTypedef() ? "unsigned " : "") + getCName();
+ return getCVAttributesString() + ( unsigned && !typedefUnsigned ? "unsigned " : "") + getCName();
}
@Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new IntType(getName(), getSize(), isUnsigned(), cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
+ public boolean setTypedefName(final String name) {
+ if( super.setTypedefName(name) ) {
+ typedefUnsigned = unsigned;
+ return true;
+ } else {
+ return false;
}
- return t;
}
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/MemoryLayoutType.java b/src/java/com/jogamp/gluegen/cgram/types/MemoryLayoutType.java
index ba46aed..8b06a7e 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/MemoryLayoutType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/MemoryLayoutType.java
@@ -36,6 +36,10 @@ public abstract class MemoryLayoutType extends Type {
super(name, size, cvAttributes, astLocus);
isLayouted = false;
}
+ MemoryLayoutType(final MemoryLayoutType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ isLayouted = o.isLayouted;
+ }
public boolean isLayouted() { return isLayouted; }
public void setLayouted() {
diff --git a/src/java/com/jogamp/gluegen/cgram/types/PointerType.java b/src/java/com/jogamp/gluegen/cgram/types/PointerType.java
index 76cb4b3..5707b5c 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/PointerType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/PointerType.java
@@ -55,6 +55,16 @@ public class PointerType extends Type implements Cloneable {
this.targetType = targetType;
}
+ private PointerType(final PointerType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ targetType = o.targetType;
+ }
+
+ @Override
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new PointerType(this, cvAttributes, astLocus);
+ }
+
@Override
protected int hashCodeImpl() {
return targetType.hashCode();
@@ -78,11 +88,11 @@ public class PointerType extends Type implements Cloneable {
}
@Override
- public boolean hasName() {
+ public boolean isAnon() {
if ( isTypedef() ) {
- return super.hasName();
+ return super.isAnon();
} else {
- return targetType.hasName();
+ return targetType.isAnon();
}
}
@@ -165,13 +175,4 @@ public class PointerType extends Type implements Cloneable {
super.visit(arg);
targetType.visit(arg);
}
-
- @Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new PointerType(getSize(), targetType, cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getName(), getTypedefCVAttributes());
- }
- return t;
- }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/PrimitiveType.java b/src/java/com/jogamp/gluegen/cgram/types/PrimitiveType.java
index 69e28ab..76f3ff1 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/PrimitiveType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/PrimitiveType.java
@@ -47,6 +47,10 @@ public abstract class PrimitiveType extends Type implements Cloneable {
super(name, size, cvAttributes, astLocus);
}
+ PrimitiveType(final PrimitiveType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ }
+
@Override
public boolean isPrimitive() {
return true;
diff --git a/src/java/com/jogamp/gluegen/cgram/types/StructType.java b/src/java/com/jogamp/gluegen/cgram/types/StructType.java
index 7f2f865..fa78006 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/StructType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/StructType.java
@@ -35,19 +35,17 @@ public class StructType extends CompoundType {
super (name, size, cvAttributes, structName, astLocus);
}
- @Override
- public final boolean isStruct() { return true; }
- @Override
- public final boolean isUnion() { return false; }
+ private StructType(final StructType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ }
@Override
- Type newCVVariant(final int cvAttributes) {
- final StructType t = new StructType(getName(), getSize(), cvAttributes, getStructName(), astLocus);
- t.setFields(getFields());
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new StructType(this, cvAttributes, astLocus);
}
+ @Override
+ public final boolean isStruct() { return true; }
+ @Override
+ public final boolean isUnion() { return false; }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/Type.java b/src/java/com/jogamp/gluegen/cgram/types/Type.java
index 04ea3a3..04c46af 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/Type.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/Type.java
@@ -51,9 +51,10 @@ import com.jogamp.gluegen.cgram.types.TypeComparator.SemanticEqualityOp;
double. All types have an associated name. Structs and unions are
modeled as "compound" types -- composed of fields of primitive or
other types. */
-public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTagProvider {
+public abstract class Type implements SemanticEqualityOp, ASTLocusTagProvider {
public final boolean relaxedEqSem;
private final int cvAttributes;
+ final ASTLocusTag astLocus;
private String name;
private SizeThunk size;
private int typedefCVAttributes;
@@ -62,16 +63,25 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
private int cachedHash;
private boolean hasCachedSemanticHash;
private int cachedSemanticHash;
- final ASTLocusTag astLocus;
protected Type(final String name, final SizeThunk size, final int cvAttributes, final ASTLocusTag astLocus) {
setName(name); // -> clearCache()
this.relaxedEqSem = TypeConfig.relaxedEqualSemanticsTest();
this.cvAttributes = cvAttributes;
+ this.astLocus = astLocus;
this.size = size;
this.typedefCVAttributes = 0;
this.isTypedef = false;
+ }
+ Type(final Type o, final int cvAttributes, final ASTLocusTag astLocus) {
+ this.relaxedEqSem = o.relaxedEqSem;
+ this.cvAttributes = cvAttributes;
this.astLocus = astLocus;
+ this.name = o.name;
+ this.size = o.size;
+ this.typedefCVAttributes = o.typedefCVAttributes;
+ this.isTypedef = o.isTypedef;
+ clearCache();
}
protected final void clearCache() {
@@ -81,21 +91,40 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
cachedSemanticHash = 0;
}
- @Override
- public Object clone() {
- try {
- return super.clone();
- } catch (final CloneNotSupportedException ex) {
- throw new InternalError();
+ /**
+ * Return a variant of this type matching the given const/volatile
+ * attributes. May return this object if the attributes match.
+ */
+ public final Type newCVVariant(final int cvAttributes) {
+ if (this.cvAttributes == cvAttributes) {
+ return this;
+ } else {
+ return newVariantImpl(true, cvAttributes, astLocus);
}
}
+ /**
+ * Clones this instance using a new {@link ASTLocusTag}.
+ */
+ public Type clone(final ASTLocusTag newLoc) {
+ return newVariantImpl(true, cvAttributes, newLoc);
+ }
+
+ /**
+ * Create a new variant of this type matching the given parameter
+ * <p>
+ * Implementation <i>must</i> use {@link Type}'s copy-ctor: {@link #Type(Type, int, ASTLocusTag)}!
+ * </p>
+ * @param newCVVariant true if new variant is intended to have new <i>cvAttributes</i>
+ * @param cvAttributes the <i>cvAttributes</i> to be used
+ * @param astLocus the {@link ASTLocusTag} to be used
+ */
+ abstract Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus);
+
@Override
public final ASTLocusTag getASTLocusTag() { return astLocus; }
- public final boolean isAnonymous() { return null == name; }
-
- public boolean hasName() { return null != name; }
+ public boolean isAnon() { return null == name; }
/** Returns the name of this type. The returned string is suitable
for use as a type specifier for native C. Does not include any const/volatile
@@ -143,10 +172,6 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
}
// For debugging
public final String getDebugString() {
- return getDebugString(false);
- }
- // For debugging
- public final String getDebugString(final boolean withASTLoc) {
final StringBuilder sb = new StringBuilder();
boolean prepComma = false;
sb.append("CType[");
@@ -245,9 +270,6 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
}
sb.append("]");
}
- if( withASTLoc ) {
- sb.append(", loc ").append(astLocus);
- }
sb.append("]");
return sb.toString();
}
@@ -267,7 +289,7 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
* of hashes.
* </p>
*/
- protected final boolean setName(final String name) {
+ private final boolean setName(final String name) {
clearCache();
if( null == name || 0 == name.length() ) {
this.name = name;
@@ -286,29 +308,19 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
* of hashes.
* </p>
*/
- public final void setTypedefName(final String name) {
+ public boolean setTypedefName(final String name) {
if( setName(name) ) {
// Capture the const/volatile attributes at the time of typedef so
// we don't redundantly repeat them in the CV attributes string
typedefCVAttributes = cvAttributes;
isTypedef = true;
- }
- }
- /**
- * Set the typedef name of this type and renders this type a typedef,
- * if given {@code name} has a length.
- * <p>
- * Method issues {@link #clearCache()}, to force re-evaluation
- * of hashes.
- * </p>
- */
- final void setTypedef(final String name, final int typedefedCVAttributes) {
- if( setName(name) ) {
- this.typedefCVAttributes = typedefedCVAttributes;
- this.isTypedef = true;
+ return true;
+ } else {
+ return false;
}
}
final void setTypedef(final int typedefedCVAttributes) {
+ this.name = this.name.intern(); // just make sure ..
this.typedefCVAttributes = typedefedCVAttributes;
this.isTypedef = true;
clearCache();
@@ -418,6 +430,7 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
int hash = 31 + ( isTypedef ? 1 : 0 );
hash = ((hash << 5) - hash) + ( null != size ? size.hashCode() : 0 );
hash = ((hash << 5) - hash) + cvAttributes;
+ hash = ((hash << 5) - hash) + typedefCVAttributes;
hash = ((hash << 5) - hash) + ( null != name ? name.hashCode() : 0 );
if( !isTypedef ) {
hash = ((hash << 5) - hash) + hashCodeImpl();
@@ -445,6 +458,7 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
( null == size && null == t.size )
) &&
cvAttributes == t.cvAttributes &&
+ typedefCVAttributes == t.typedefCVAttributes &&
( null == name ? null == t.name : name.equals(t.name) )
)
{
@@ -467,6 +481,7 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
int hash = 31 + ( null != size ? size.hashCodeSemantics() : 0 );
if( !relaxedEqSem ) {
hash = ((hash << 5) - hash) + cvAttributes;
+ hash = ((hash << 5) - hash) + typedefCVAttributes;
}
hash = ((hash << 5) - hash) + hashCodeSemanticsImpl();
cachedSemanticHash = hash;
@@ -488,7 +503,11 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
if( ( ( null != size && size.equalSemantics(t.size) ) ||
( null == size && null == t.size )
) &&
- ( relaxedEqSem || cvAttributes == t.cvAttributes )
+ ( relaxedEqSem ||
+ ( cvAttributes == t.cvAttributes &&
+ typedefCVAttributes == t.typedefCVAttributes
+ )
+ )
)
{
return equalSemanticsImpl(t);
@@ -499,8 +518,10 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
}
protected abstract boolean equalSemanticsImpl(final Type t);
- /** Visit this type and all of the component types of this one; for
- example, the return type and argument types of a FunctionType. */
+ /**
+ * Traverse this {@link Type} and all of its component types; for
+ * example, the return type and argument types of a FunctionType.
+ */
public void visit(final TypeVisitor visitor) {
visitor.visitType(this);
}
@@ -518,19 +539,6 @@ public abstract class Type implements Cloneable, SemanticEqualityOp, ASTLocusTag
return "";
}
- /** Return a variant of this type matching the given const/volatile
- attributes. May return this object if the attributes match. */
- public final Type getCVVariant(final int cvAttributes) {
- if (this.cvAttributes == cvAttributes) {
- return this;
- }
- return newCVVariant(cvAttributes);
- }
-
- /** Create a new variant of this type matching the given
- const/volatile attributes. */
- abstract Type newCVVariant(int cvAttributes);
-
/** Helper method for determining how many pointer indirections this
type represents (i.e., "void **" returns 2). Returns 0 if this
type is not a pointer type. */
diff --git a/src/java/com/jogamp/gluegen/cgram/types/TypeVisitor.java b/src/java/com/jogamp/gluegen/cgram/types/TypeVisitor.java
index 89c014b..ed5cfa9 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/TypeVisitor.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/TypeVisitor.java
@@ -39,6 +39,12 @@
package com.jogamp.gluegen.cgram.types;
+/**
+ * A visitor for {@link Type}'s visitor model.
+ */
public interface TypeVisitor {
+ /**
+ * Visiting the given {@link Type}.
+ */
public void visitType(Type t);
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/UnionType.java b/src/java/com/jogamp/gluegen/cgram/types/UnionType.java
index e03d671..8c6d9dd 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/UnionType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/UnionType.java
@@ -35,19 +35,17 @@ public class UnionType extends CompoundType {
super (name, size, cvAttributes, structName, astLocus);
}
- @Override
- public final boolean isStruct() { return false; }
- @Override
- public final boolean isUnion() { return true; }
+ private UnionType(final UnionType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ }
@Override
- Type newCVVariant(final int cvAttributes) {
- final UnionType t = new UnionType(getName(), getSize(), cvAttributes, getStructName(), astLocus);
- t.setFields(getFields());
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new UnionType(this, cvAttributes, astLocus);
}
+ @Override
+ public final boolean isStruct() { return false; }
+ @Override
+ public final boolean isUnion() { return true; }
}
diff --git a/src/java/com/jogamp/gluegen/cgram/types/VoidType.java b/src/java/com/jogamp/gluegen/cgram/types/VoidType.java
index f63bda3..bf51523 100644
--- a/src/java/com/jogamp/gluegen/cgram/types/VoidType.java
+++ b/src/java/com/jogamp/gluegen/cgram/types/VoidType.java
@@ -51,18 +51,18 @@ public class VoidType extends Type implements Cloneable {
super(name, null, cvAttributes, astLocus);
}
+ private VoidType(final VoidType o, final int cvAttributes, final ASTLocusTag astLocus) {
+ super(o, cvAttributes, astLocus);
+ }
+
@Override
- public VoidType asVoid() {
- return this;
+ Type newVariantImpl(final boolean newCVVariant, final int cvAttributes, final ASTLocusTag astLocus) {
+ return new VoidType(this, cvAttributes, astLocus);
}
@Override
- Type newCVVariant(final int cvAttributes) {
- final Type t = new VoidType(getName(), cvAttributes, astLocus);
- if( isTypedef() ) {
- t.setTypedef(getTypedefCVAttributes());
- }
- return t;
+ public VoidType asVoid() {
+ return this;
}
@Override