blob: 6ed3b42b04d38413433c98af1cf46ece545c0968 [file] [log] [blame]
package org.eclipse.cdt.internal.core.parser.util;
import org.eclipse.cdt.internal.core.parser.Token;
/**
* @author jcamelon
*
* To change this generated comment edit the template variable "typecomment":
* Window>Preferences>Java>Templates.
* To enable and disable the creation of type comments go to
* Window>Preferences>Java>Code Generation.
*/
public class DeclSpecifier {
// DeclSpecifier layed out as bit array
// leftmost 5 bits are type
public static final int typeMask = 0x001f;
public static final int isAuto = 0x0020;
public static final int isRegister = 0x0040;
public static final int isStatic = 0x0080;
public static final int isExtern = 0x0100;
public static final int isMutable = 0x0200;
public static final int isInline = 0x0400;
public static final int isVirtual = 0x0800;
public static final int isExplicit = 0x1000;
public static final int isTypedef = 0x2000;
public static final int isFriend = 0x4000;
public static final int isConst = 0x8000;
public static final int isVolatile = 0x10000;
public static final int isUnsigned = 0x20000;
public static final int isShort = 0x40000;
public static final int isLong = 0x80000;
private int declSpecifierSeq = 0;
public int getDeclSpecifierSeq() { return declSpecifierSeq; }
// Convenience methods
private void setBit(boolean b, int mask) {
if (b)
declSpecifierSeq = declSpecifierSeq | mask;
else
declSpecifierSeq = declSpecifierSeq & ~mask;
}
private boolean checkBit(int mask) {
return (declSpecifierSeq & mask) == 1;
}
public void setAuto(boolean b) { setBit(b, isAuto); }
public boolean isAuto() { return checkBit(isAuto); }
public void setRegister(boolean b) { setBit(b, isRegister); }
public boolean isRegister() { return checkBit(isRegister); }
public void setStatic(boolean b) { setBit(b, isStatic); }
public boolean isStatic() { return checkBit(isStatic); }
public void setExtern(boolean b) { setBit(b, isExtern); }
public boolean isExtern() { return checkBit(isExtern); }
public void setMutable(boolean b) { setBit(b, isMutable); }
public boolean isMutable() { return checkBit(isMutable); }
public void setInline(boolean b) { setBit(b, isInline); }
public boolean isInline() { return checkBit(isInline); }
public void setVirtual(boolean b) { setBit(b, isVirtual); }
public boolean isVirtual() { return checkBit(isVirtual); }
public void setExplicit(boolean b) { setBit(b, isExplicit); }
public boolean isExplicit() { return checkBit(isExplicit); }
public void setTypedef(boolean b) { setBit(b, isTypedef); }
public boolean isTypedef() { return checkBit(isTypedef); }
public void setFriend(boolean b) { setBit(b, isFriend); }
public boolean isFriend() { return checkBit(isFriend); }
public void setConst(boolean b) { setBit(b, isConst); }
public boolean isConst() { return checkBit(isConst); }
public void setVolatile(boolean b) { setBit(b, isVolatile); }
public boolean isVolatile() { return checkBit(isVolatile); }
public void setUnsigned(boolean b) { setBit(b, isUnsigned); }
public boolean isUnsigned() { return checkBit(isUnsigned); }
public void setShort(boolean b) { setBit(b, isShort); }
public boolean isShort() { return checkBit(isShort); }
public void setLong(boolean b) { setBit(b, isLong); }
public boolean isLong() { return checkBit(isLong); }
// Simple Types
public static final int t_type = 0; // Type Specifier
public static final int t_char = 1;
public static final int t_wchar_t = 2;
public static final int t_bool = 3;
public static final int t_int = 4;
public static final int t_float = 5;
public static final int t_double = 6;
public static final int t_void = 7;
public void setType( Token token )
{
switch (token.getType()) {
case Token.t_auto:
setAuto(true);
break;
case Token.t_register:
setRegister(true);
break;
case Token.t_static:
setStatic(true);
break;
case Token.t_extern:
setExtern(true);
break;
case Token.t_mutable:
setMutable(true);
break;
case Token.t_inline:
setInline(true);
break;
case Token.t_virtual:
setVirtual(true);
break;
case Token.t_explicit:
setExplicit(true);
break;
case Token.t_typedef:
setTypedef(true);
break;
case Token.t_friend:
setFriend(true);
break;
case Token.t_const:
setConst(true);
break;
case Token.t_volatile:
setVolatile(true);
break;
case Token.t_char:
setType(DeclarationSpecifier.t_char);
break;
case Token.t_wchar_t:
setType(DeclarationSpecifier.t_wchar_t);
break;
case Token.t_bool:
setType(DeclarationSpecifier.t_bool);
break;
case Token.t_short:
setShort(true);
break;
case Token.t_int:
setType(DeclarationSpecifier.t_int);
break;
case Token.t_long:
setLong(true);
break;
case Token.t_signed:
setUnsigned(false);
break;
case Token.t_unsigned:
setUnsigned(true);
break;
case Token.t_float:
setType(DeclarationSpecifier.t_float);
break;
case Token.t_double:
setType(DeclarationSpecifier.t_double);
break;
case Token.t_void:
setType(DeclarationSpecifier.t_void);
break;
case Token.tIDENTIFIER:
setType(DeclarationSpecifier.t_type);
break;
}
}
public void setType(int t) {
declSpecifierSeq = declSpecifierSeq & ~typeMask | t;
}
public int getType() {
return declSpecifierSeq & typeMask;
}
}