1 package polyglot.types; 2 3 import polyglot.util.InternalCompilerError; 4 import polyglot.util.Enum; 5 6 import java.io.Serializable ; 7 import java.util.*; 8 9 14 public class Flags implements Serializable 15 { 16 17 static final int[] print_order = new int[64]; 18 static int next_bit = 0; 19 20 21 static final String [] flag_names = new String [64]; 22 23 public static final Flags NONE = new Flags(0); 24 public static final Flags PUBLIC = createFlag("public", null); 25 public static final Flags PRIVATE = createFlag("private", null); 26 public static final Flags PROTECTED = createFlag("protected", null); 27 public static final Flags STATIC = createFlag("static", null); 28 public static final Flags FINAL = createFlag("final", null); 29 public static final Flags SYNCHRONIZED = createFlag("synchronized", null); 30 public static final Flags TRANSIENT = createFlag("transient", null); 31 public static final Flags NATIVE = createFlag("native", null); 32 public static final Flags INTERFACE = createFlag("interface", null); 33 public static final Flags ABSTRACT = createFlag("abstract", null); 34 public static final Flags VOLATILE = createFlag("volatile", null); 35 public static final Flags STRICTFP = createFlag("strictfp", null); 36 37 38 protected static final Flags ACCESS_FLAGS = PUBLIC.set(PRIVATE).set(PROTECTED); 39 40 41 protected long bits; 42 43 52 public static Flags createFlag(String name, Flags after) { 53 if (next_bit >= flag_names.length) 54 throw new InternalCompilerError("too many flags"); 55 if (print_order[next_bit] != 0) 56 throw new InternalCompilerError("print_order and next_bit " + 57 "inconsistent"); 58 if (flag_names[next_bit] != null) 59 throw new InternalCompilerError("flag_names and next_bit " + 60 "inconsistent"); 61 62 int bit = next_bit++; 63 flag_names[bit] = name; 64 65 if (after == null) { 66 print_order[bit] = bit; 67 } 68 else { 69 for (int i = bit; i > 0; i--) { 70 if ((after.bits & print_order[i]) != 0) 71 break; 72 73 print_order[i] = print_order[i-1]; 75 print_order[i-1] = bit; 76 } 77 } 78 79 return new Flags(1L << bit); 80 } 81 82 85 protected Flags(long bits) { 86 this.bits = bits; 87 } 88 89 92 public Flags set(Flags other) { 93 return new Flags(bits | other.bits); 94 } 95 96 99 public Flags clear(Flags other) { 100 return new Flags(bits & ~other.bits); 101 } 102 103 106 public Flags retain(Flags other) { 107 return new Flags(bits & other.bits); 108 } 109 110 113 public boolean intersects(Flags other) { 114 return (bits & other.bits) != 0; 115 } 116 117 120 public boolean contains(Flags other) { 121 return (bits & other.bits) == other.bits; 122 } 123 124 128 public Flags Public() { 129 return set(PUBLIC); 130 } 131 132 136 public Flags clearPublic() { 137 return clear(PUBLIC); 138 } 139 140 143 public boolean isPublic() { 144 return contains(PUBLIC); 145 } 146 147 151 public Flags Private() { 152 return set(PRIVATE); 153 } 154 155 159 public Flags clearPrivate() { 160 return clear(PRIVATE); 161 } 162 163 166 public boolean isPrivate() { 167 return contains(PRIVATE); 168 } 169 170 174 public Flags Protected() { 175 return set(PROTECTED); 176 } 177 178 182 public Flags clearProtected() { 183 return clear(PROTECTED); 184 } 185 186 189 public boolean isProtected() { 190 return contains(PROTECTED); 191 } 192 193 197 public Flags Package() { 198 return clear(ACCESS_FLAGS); 199 } 200 201 205 public boolean isPackage() { 206 return ! intersects(ACCESS_FLAGS); 207 } 208 209 213 public Flags Static() { 214 return set(STATIC); 215 } 216 217 221 public Flags clearStatic() { 222 return clear(STATIC); 223 } 224 225 228 public boolean isStatic() { 229 return contains(STATIC); 230 } 231 232 236 public Flags Final() { 237 return set(FINAL); 238 } 239 240 244 public Flags clearFinal() { 245 return clear(FINAL); 246 } 247 248 251 public boolean isFinal() { 252 return contains(FINAL); 253 } 254 255 259 public Flags Synchronized() { 260 return set(SYNCHRONIZED); 261 } 262 263 267 public Flags clearSynchronized() { 268 return clear(SYNCHRONIZED); 269 } 270 271 275 public boolean isSynchronized() { 276 return contains(SYNCHRONIZED); 277 } 278 279 283 public Flags Transient() { 284 return set(TRANSIENT); 285 } 286 287 291 public Flags clearTransient() { 292 return clear(TRANSIENT); 293 } 294 295 298 public boolean isTransient() { 299 return contains(TRANSIENT); 300 } 301 302 306 public Flags Native() { 307 return set(NATIVE); 308 } 309 310 314 public Flags clearNative() { 315 return clear(NATIVE); 316 } 317 318 321 public boolean isNative() { 322 return contains(NATIVE); 323 } 324 325 329 public Flags Interface() { 330 return set(INTERFACE); 331 } 332 333 337 public Flags clearInterface() { 338 return clear(INTERFACE); 339 } 340 341 344 public boolean isInterface() { 345 return contains(INTERFACE); 346 } 347 348 352 public Flags Abstract() { 353 return set(ABSTRACT); 354 } 355 356 360 public Flags clearAbstract() { 361 return clear(ABSTRACT); 362 } 363 364 367 public boolean isAbstract() { 368 return contains(ABSTRACT); 369 } 370 371 375 public Flags Volatile() { 376 return set(VOLATILE); 377 } 378 379 383 public Flags clearVolatile() { 384 return clear(VOLATILE); 385 } 386 387 390 public boolean isVolatile() { 391 return contains(VOLATILE); 392 } 393 394 398 public Flags StrictFP() { 399 return set(STRICTFP); 400 } 401 402 406 public Flags clearStrictFP() { 407 return clear(STRICTFP); 408 } 409 410 413 public boolean isStrictFP() { 414 return contains(STRICTFP); 415 } 416 417 421 public boolean moreRestrictiveThan(Flags f) { 422 if (isPrivate() && (f.isProtected() || f.isPackage() || f.isPublic())) { 423 return true; 424 } 425 426 if (isPackage() && (f.isProtected() || f.isPublic())) { 427 return true; 428 } 429 430 if (isProtected() && f.isPublic()) { 431 return true; 432 } 433 434 return false; 435 } 436 437 public String toString() { 438 return translate().trim(); 439 } 440 441 444 public String translate() { 445 StringBuffer sb = new StringBuffer (); 446 447 for (int i = 0; i < next_bit; i++) { 448 int bit = print_order[i]; 449 if ((bits & (1L << bit)) != 0) { 450 sb.append(flag_names[bit]); 451 sb.append(" "); 452 } 453 } 454 455 return sb.toString(); 456 } 457 458 public int hashCode() { 459 return (int) (bits >> 32 | bits) * 37; 460 } 461 462 public boolean equals(Object o) { 463 return o instanceof Flags && bits == ((Flags) o).bits; 464 } 465 } 466 | Popular Tags |