From e0dd60c57aa7229f3bed5ac904149f3ccf8c2853 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 7 Apr 2016 15:19:15 +0300 Subject: [PATCH] Expand code for boolean fields in Flags Push flag index computation logic from FlagField down to subclasses (BooleanFlagField and EnumLiteFlagField) because in the case of BooleanFlagField it's trivial --- .../jetbrains/kotlin/serialization/Flags.java | 98 +++++++++---------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java index e33bb5aa4a5..3c229298700 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/Flags.java @@ -74,15 +74,6 @@ public class Flags { // --- - private static int bitWidth(@NotNull E[] enumEntries) { - int length = enumEntries.length - 1; - if (length == 0) return 1; - for (int i = 31; i >= 0; i--) { - if ((length & (1 << i)) != 0) return i + 1; - } - throw new IllegalStateException("Empty enum: " + enumEntries.getClass()); - } - public static int getClassFlags( boolean hasAnnotations, Visibility visibility, @@ -282,66 +273,71 @@ public class Flags { return new BooleanFlagField(offset); } - private final int offset; - private final int bitWidth; + protected final int offset; + protected final int bitWidth; + + private FlagField(int offset, int bitWidth) { + this.offset = offset; + this.bitWidth = bitWidth; + } + + public abstract E get(int flags); + + public abstract int toFlags(E value); + } + + @SuppressWarnings("WeakerAccess") + public static class BooleanFlagField extends FlagField { + public BooleanFlagField(int offset) { + super(offset, 1); + } + + @Override + @NotNull + public Boolean get(int flags) { + return (flags & (1 << offset)) != 0; + } + + @Override + public int toFlags(Boolean value) { + return value ? 1 << offset : 0; + } + } + + private static class EnumLiteFlagField extends FlagField { private final E[] values; - private FlagField(int offset, E[] values) { - this.offset = offset; - this.bitWidth = bitWidth(values); + public EnumLiteFlagField(int offset, E[] values) { + super(offset, bitWidth(values)); this.values = values; } + private static int bitWidth(@NotNull E[] enumEntries) { + int length = enumEntries.length - 1; + if (length == 0) return 1; + for (int i = 31; i >= 0; i--) { + if ((length & (1 << i)) != 0) return i + 1; + } + throw new IllegalStateException("Empty enum: " + enumEntries.getClass()); + } + + @Override @Nullable public E get(int flags) { int maskUnshifted = (1 << bitWidth) - 1; int mask = maskUnshifted << offset; int value = (flags & mask) >> offset; for (E e : values) { - if (getIntValue(e) == value) { + if (e.getNumber() == value) { return e; } } return null; } + @Override public int toFlags(E value) { - return getIntValue(value) << offset; - } - - protected abstract int getIntValue(E value); - - } - - public static class BooleanFlagField extends FlagField { - private static final Boolean[] BOOLEAN = { false, true }; - - public BooleanFlagField(int offset) { - super(offset, BOOLEAN); - } - - @Override - protected int getIntValue(Boolean value) { - return value ? 1 : 0; - } - - @NotNull - @Override - public Boolean get(int flags) { - //noinspection ConstantConditions - return super.get(flags); + return value.getNumber() << offset; } } - - private static class EnumLiteFlagField extends FlagField { - public EnumLiteFlagField(int offset, E[] values) { - super(offset, values); - } - - @Override - protected int getIntValue(E value) { - return value.getNumber(); - } - } - }